Используйте HDL import, чтобы импортировать синтезируемый HDL-код в среду моделирования Simulink®. Чтобы импортировать HDL-код, используйте importhdl
функция. Убедитесь, что построения, используемые в HDL-коде, поддерживаются импортом HDL.
Эти таблицы приводят поддерживаемые шаблоны потока данных Verilog®HDL, которые можно использовать при импорте HDL-кода. Если ваш код использует неподдерживаемую модель потока данных, такую как код, который выводит фиксатор, importhdl
генерирует сообщение об ошибке со ссылкой на имя файла и номер строки. Можно затем обновить код, как проиллюстрировано в предыдущих примерах.
Модель потока данных Verilog | Пример код 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 |
Несколько присвоений на ту же переменную в истинном или ложном пути блока 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 |
Эти построения потока данных не поддержаны, когда вы импортируете код Verilog. Столбец Сценариев Описания и Примера описывает каждый сценарий с примером и иллюстрирует, как можно избежать этого сценария.
Модель потока данных Verilog | Описание и сценарии в качестве примера |
---|---|
Фиксируйте обнаружение из кода Verilog. | Присутствие фиксаторов в HDL-коде может привести к алгебраическим циклам в сгенерированной модели Simulink и привести к отказам компиляции модели. Чтобы избежать вывода фиксатора, задайте все ветви в если еще условия и в случае, если операторы. Например, когда вы импортируете этот код Verilog, если-условие выведено как блок 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 |
Инициализация нескольких RAM, которые выведены в том же модуле. | Например, этот код 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 использует если еще условие присвоить значение переменной 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 |