Используйте HDL import для импорта синтезируемого HDL-кода в Simulink® окружение моделирования. Для импорта HDL-кода используйте importhdl функция. Убедитесь, что конструкции, используемые в HDL-коде, поддерживаются импортом HDL.
В этих таблицах перечислены поддерживаемые Verilog® HDL- шаблонов dataflow, которые можно использовать при импорте HDL-кода. Если ваш код использует неподдерживаемую модель dataflow, такую как код, который выводит защелку, importhdl генерирует сообщение об ошибке со ссылкой на имя файла и номер линии. Затем можно обновить код, как показано в предыдущих примерах.
| Модель Verilog Dataflow | Пример кода Verilog |
|---|---|
Назначения блокировки в последовательных всегда блоках и назначения без блокировки в комбинационных всегда блоках. | Например, этот код Verilog использует последовательное назначение для переменной
module dataconv(clk,a,b,c);
input clk; integer i;
input wire [7:0] a, b;
output wire [7:0] c;
reg [1:0] temp [0:7];
always @(*) begin
for (i=0;i<=7;i=i+1) begin
temp[i] <= a[i] + b[i];
end
end
assign c = temp;
endmodule
|
Несколько назначений одному и тому же сигналу. Можно использовать частичные и полные назначения этому сигналу. | В этом примере показан код Verilog, который выполняет как частичное присвоение, так и полное присвоение переменной
module testPartialAndCompleteAssign
(input [2:0] in1, in2,
input cond, clk,
output [2:0] out1);
reg [2:0] out1_reg;
always@(posedge clk) begin
if(cond) begin
out1_reg[0] = 1'b0;
out1_reg[1] = 1'b0;
out1_reg[2] = 1'b0;
end
else begin
out_reg = in1 & in2;
end
end
assign out1 = out1_reg;
endmodule
|
Несколько назначений одной и той же переменной в пути true или false блока Switch, который выводится. | Например, этот код Verilog выполняет несколько присвоений переменной
module testSwitchMuxing
(input [2:0] in1,
input cond,
output reg [2:0] out1);
always@(*) begin
if (cond) begin
out1 = in1;
end
else begin
out1 = 3'd2;
out1 = 3'd1;
end
end
endmodule
|
| Выбор бита, выбор детали и операции индексации массива с сигналами. Выводится Multiport Switch, когда индексация массива выполняется в RHS. Операция индексации массива в LHS выводится как блок Assign. | Например, этот код Verilog использует несколько назначений переменной
module ArrayIndexing
(In1, In2, In3, In4,
Sel1, Sel2,
Out1, Out2, Out3);
parameter w = 7;
input [w:0] In1, In2, In3, In4;
input [1:0] Sel1, Sel2;
output [w:0] Out1;
output [1:0] Out2;
output Out3;
wire [w:0] v[3:0];
assign v[0] = In1;
assign v[1] = In2;
assign v[2] = In3;
assign v[3] = In4;
//Array indexing with signal Sel1
assign Out1 = v[Sel1];
//Part select on array index with signal Sel2
assign Out2 = v[Sel2][7:2];
//Bit select on array index with signal Sel
assign Out3 = v[Sel2][4];
endmodule
|
Эти конструкции dataflow не поддерживаются при импорте кода Verilog. В столбцах Описание и Пример сценариев описывается каждый сценарий с помощью примера и показано, как избежать этого сценария.
| Модель Verilog Dataflow | Описание и примеры сценариев |
|---|---|
Обнаружение защелки из кода Verilog. | Наличие защелок в HDL-коде может привести к алгебраическим циклам в сгенерированной модели Simulink и привести к отказам компиляции модели. Чтобы избежать вывода защелки, задайте все ветви в условиях if-else и в операторах case. Для примера при импорте этого кода Verilog условие if выводится как Switch блок. Блок имеет истинный путь, который задан в коде. Выход блока Switch передается назад непосредственно как вход в ложный путь, который приводит к алгебраическому циклу.
module testAlgebraicLoop(input cond,
input [2:0] in1,
output reg [2:0] out1);
// causes latch inference - unsupported
always@(*) begin
if (cond) begin
out1 = in1;
end
end
// Specify else branch to avoid latch inference
// always@(*) begin
// if (cond) begin
// out1 = in1;
// end
// else begin
// out1 = in1 + 1;
// end
// end
endmodule
|
| Выполнение операций с сигналами включения синхроимпульса, сброса или синхроимпульса в коде Verilog. | Когда вы задаете сигналы, используя такие имена, как Для примера этот код Verilog использует явное назначение с тактовым сигналом
module testOperationOnClkBundle
(input [2:0] in1,
input clk,
output reg [2:0] out1,
output out2);
reg [2:0] out1_reg;
always@(posedge clk) begin
out1_reg <= in1;
end
assign out2 = clk && 1'b1;
endmodule
Убедитесь, что код Verilog не выполняет операции ни по одному из сигналов в пакете синхроимпульсов. В сложение, для сигналов, которые вы используете для выполнения расчетов в коде, убедитесь, что имена сигналов не совпадают ни с одним из имен, которые выводятся как сигналы времени, сброса или включения. Смотрите |
Чувствительность синхроимпульса или сигнала сброса к различным ребрам синхроимпульса или другим ребрам сброса внутри того же модуля. | Вы не можете иметь один Для примера этот код Verilog использует положительные и отрицательные ребра тех же часов, которая не поддерживается.
module testMultipleClockEdges
(input [2:0] in1, in2,
input clk,
output [2:0] out1, out2);
reg [2:0] out1_reg, out2_reg;
/* clk sensitivity to posedge */
always@(posedge clk) begin
out1_reg <= in1 && in2;
end
/* clk sensitivity to neegedge */
always@(negedge clk) begin
out2_reg <= in1 || in2;
end
assign out1 = out1_reg;
assign out2 = out2_reg;
endmodule
Убедитесь, что ваш код Verilog не использует обоих ребер синхроимпульса или сигнала сброса в одном модуле. Используйте любой из |
Реализация синхронных и асинхронных схем внутри одного модуля. | Вы не можете использовать код Verilog реализует обе схемы в том же модуле, как показано на коде ниже. Используйте различные модули для реализации асинхронных и синхронных схем.
module testSynchronousAsynchronous
(input [2:0] in1, in2,
input clk, reset,
output [2:0] out1, out2);
reg [2:0] out1_reg, out2_reg;
/* synchronous always block */
always@(posedge clk) begin
out1_reg <= in1 && in2;
end
/* asynchronous always block */
always@(posedge clk or posedge reset)
begin
out2_reg <= in1 || in2;
end
assign out1 = out1_reg;
assign out2 = out2_reg;
endmodule
|
Инициализация нескольких ОЗУ, которые выводятся в том же модуле. | Для примера этот код Verilog выводит
module testMultipleRAMs
(input [2:0] in1, in2,
input clk, reset,
output reg [2:0] read_data0, read_data1);
reg [2:0] out1_reg, out2_reg;
/* Inference of RAM sample_store0 */
always@(posedge clk) begin
if (write_enable) begin
sample_store0[write_address] <= write_data;
end
read_data0 = sample_store0[read_address0]
end
/* Inference of RAM sample_store1 */
always@(posedge clk) begin
if (write_enable) begin
sample_store1[write_address] <= write_data;
end
read_data1 = sample_store0[read_address1]
end
endmodule
|
Использование определенных конструкций при считывании начальных значений из | Система координат Например, этот код Verilog использует условие if-else, чтобы присвоить значение переменной
module testInitial
(input cond,
input [3:0] write_data
output reg [3:0] dout_a, dout_b, doutc);
parameter AddrWidth = 3;
integer i;
reg [3:0] ram [7:0];
initial begin
for (i=0; i<=2**AddrWidth - 1; i=i+1) begin
ram[i] = 0;
end
dout_b = 0;
// if-else condition - not supported
if (cond) begin
dout_a = 0;
end
else begin
dout_a = 4;
end
end
// Variable assignment to RHS - not supported
dout_a = write_data;
// Use assignment statements instead for
// dout_a and dout_c
// dout_a = 4;
// dout_c = 32;
// end
// end
endmodule
|
| Все размерности сигналов, на которые не ссылаются во время использования. | Используйте все размерности сигнала в коде входа Verilog. Если вы задаете дополнительную размерность, это создает индексированный выбор бита. Для примера этот код Verilog создает
module dataconv(clk,a,b,c);
input clk;
input wire [1:0] a, b;
output wire [1:0] c;
reg [7:0] temp_reg [1:0][1:0];
// temp_reg is not indexed
// with both dimensions - not supported
always @(posedge clk) begin
temp_reg [0] <= a[0] + b[0];
temp_reg [1] <= a[1] + b[1];
end
// Use both dimensions when indexing a variable
// always @(posedge clk) begin
// temp_reg [0][0] <= a[0] + b[0];
// temp_reg [0][1] <= a[0] + b[1];
// temp_reg [1][0] <= a[1] + b[0];
// temp_reg [1][1] <= a[1] + b[1];
// You can also perform indexed bit select
// temp_reg [1][0][1] = 1'b0;
// end
assign c = temp_reg;
endmodule
|