Используйте HDL import, чтобы импортировать синтезируемый HDL-код в среду моделирования Simulink®. Чтобы импортировать HDL-код, используйте функцию importhdl
.
Эта таблица показывает ограничения импорта HDL и построений Verilog, которые не поддержаны при импорте HDL-кода.
Неподдерживаемые построения или ограничения | Описание и сценарии в качестве примера | Работа вокруг |
---|---|---|
Импорт файлов VHDL. | – | – |
Импорт файлов Verilog от папки только для чтения. | – | – |
Импорт файлов HDL, которые используют неподдерживаемые построения Verilog. | – | Используйте подмножество построений Verilog, которое поддерживается импортом HDL. Чтобы узнать больше, смотрите Поддерживаемые Построения Verilog для Импорта HDL. |
Генерация файлов предварительной обработки в файловой системе только для чтения, которые анализируют HDL-код, который вы вводите к функции | – | – |
Припишите экземпляры и комментарии, которые проигнорированы. | – | – |
(#) задерживают значения, такие как | – | – |
Типы данных перечисления. | – | – |
Больше чем один сигнал часов. | – | – |
Модули, которые являются многоскоростными. | – | – |
Многопортовый вывод Переключателя с больше, чем входными параметрами | Если вы задаете больше, чем входные параметры 1024 к Многопортовому блоку switch, который выведен из кода Verilog, импорт Verilog генерирует ошибку. Ошибка сгенерирована, потому что среда моделирования Simulink не поддерживает больше, чем входные параметры 1024 для блока. | – |
Обнаружение ROM из кода Verilog. | – | – |
Фиксируйте обнаружение. | Присутствие фиксаторов в HDL-коде может привести к алгебраическим циклам в сгенерированной модели Simulink и привести к образцовым отказам компиляции. Например, когда вы импортируете этот код Verilog, если-условие выведено как блок switch. Блок имеет истинный путь, который задан в коде. Вывод блока switch возвращен непосредственно, как введено к ложному пути, который приводит к алгебраическому циклу. module testAlgebraicLoop(input cond, input [2:0] in1, output reg [2:0] out1); always@(*) begin if (cond) begin out1 = in1; end end endmodule |
Чтобы избежать вывода фиксатора, задайте все ответвления в если еще условия и в случае, если операторы. module testAlgebraicLoop(input cond, input [2:0] in1, output reg [2:0] out1); always@(*) begin if (cond) begin out1 = in1; end else begin out1 = in1 + 1; end end endmodule |
Частичное и полное присвоение на ту же переменную в коде Verilog®. | Этот пример показывает код 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 | Когда вы присвоите одну переменную, используйте или полное присвоение или частичное присвоение. Например, этот код показывает, как можно изменить пример, чтобы выполнить полное присвоение на переменную module testCompleteAssign (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 = 3'd0; end else begin out_reg = in1 & in2; end end assign out1 = out1_reg; endmodule Этот пример показывает другой код Verilog, который выполняет частичное присвоение на переменную module testPartialAssign (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[0] = in1[0] & in2[0]; out_reg[1] = in1[1] & in2[1]; out_reg[2] = in1[2] & in2[2]; end end assign out1 = out1_reg; 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 понимает или асинхронные схемы или схемы синхронизации в том же модуле. |
Инициализация нескольких 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 не выводит больше чем один RAM в том же модуле. Можно разделить каждый вывод RAM на один модуль. |
Несколько присвоений на ту же переменную в истинном или ложном пути блока 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 | Убедитесь, что ваш код Verilog не использует больше чем одно присвоение на ту же переменную в том же пути если-условия. Можно присвоить значения той же переменной в различных ответвлениях. |
Использование определенных построений при чтении начальных значений из блока | Блок module testInitial (input cond, output reg [3:0] dout_a, dout_b); 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 (cond) begin dout_a = 0; end else begin dout_a = 4; end end endmodule Блок module testInitial (input [3:0] write_data, output reg [3:0] dout_a, dout_b); 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; dout_a = write_data; end end endmodule | Убедитесь, что
module testInitial ( output reg [3:0] dout_a, dout_b); 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; dout_a = 0; end endmodule |
Неблокирование присвоений в комбинационном always блокируются и блокирование присвоений в последовательных блоках always . | Импорт HDL выводит схему комбинационной или последовательной логики в зависимости от списка чувствительности блока Например, этот код 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 | Убедитесь, что тип присвоения совпадает с типом схемы, выведенным блоком 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]; //Proposed change 1: change assignment to blocking. always @(*) begin for (i=0;i<=7;i=i+1) begin temp[i] = a[i] + b[i]; end end //Proposed change 2: change circuit type to sequential // always @(posedge clk) begin // for (i=0;i<=7;i=i+1) begin // temp[i] <= a[i] + b[i]; // end // end assign c = temp; endmodule |
Все размерности сигналов, на которые не ссылаются во время использования. | Например, этот код Verilog создает 8-битную переменную 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]; always @(posedge clk) begin temp_reg [0] <= a[0] + b[0]; temp_reg [1] <= a[1] + b[1]; end assign c = temp; endmodule | Убедитесь, что все размерности сигнала используются в коде входа Verilog. Если вы задаете дополнительную размерность, она создает индексируемый битный выбор. module dataconv(clk,a,b,c); input clk; input wire [2:0] a, b; output wire [2:0] c; reg [7:0] temp_reg [2:0][2:0]; 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]; // This code performs an indexed bit select // temp_reg [1][0][1] = 1'b0; end assign c = temp; endmodule |