#verilog #infinite-loop #system-verilog
Вопрос:
У меня есть простой код Verilog для последовательной логической сети. Он состоит из дизайна и файла тестовой среды; он компилируется, но выполняется слишком долго. Я не уверен, почему; кроме clk
, я не вставлял в него никаких циклов. Возможно, у меня есть некоторые синтаксические ошибки при использовании двоичных чисел. Я запустил его с помощью онлайн-программы EDA Playground; я не пробовал это на Xilinx.
Симулятор: Icarus Verilog 0.9.7, параметры компиляции: -Стена. «Выполнение прервано или достигнуто максимальное время выполнения».
Это то, что написано в журнале.
Файл дизайна:
module hazimodul(
input clk,
input rst,
input ce,
input x,
output z
);
reg[1:0] all;
reg[3:0] y;
reg[0:0] zout;
always@(posedge clk)
begin
if(rst)
begin
zout <= 1'b0;
all <= 2'b00;
y <= 4'b0111;
end
else if(ce)
begin
if(all == 2'b00)
begin
if(x== 1'b0)
zout<=1'b0;
else
all <=2'b01;
end
if(all==2'b01)
begin
zout <= y[3:3];
y <= {y[2:0],y[3:3]};
if (y == 4'b0111)
all <= 2'b10;
end
if(all==2'b10)
begin
if(x == 1'b0)
all <= 2'b00;
end
end
end
assign z = zout;
endmodule
Тестовый файл:
module test;
reg clk;
reg rst;
reg x;
reg ce;
// Outputs
wire z;
// Instantiate the Unit Under Test (UUT)
hazimodul uut (
.clk(clk),
.rst(rst),
.x(x),
.ce(ce),
.z(z)
);
initial begin
// Initialize Inputs
clk = 0;
rst = 0;
x=0;
ce=0;
#10;
rst<=1;
#20;
rst<=0;
#30
ce<=1;
#40
x<=1;
#80
x<=0;
#90
x<=1;
end
always #5
clk <=~clk;
endmodule
Ответ №1:
Вам нужно сообщить симулятору, когда прекратить выполнение. Один из способов — использовать $finish
системную задачу, которую вы можете добавить в свой тестовый стенд:
initial #1000 $finish;
Теперь моделирование завершается на edaplayground. Вы можете изменить #1000
задержку на что-то более значимое для вашего дизайна.
Вот объяснение того, почему ваш код продолжает выполняться. Ваш тестовый стенд имеет 2 параллельных потока: один initial
блок и один always
блок. В обоих потоках вы добавляете события в очередь событий Verilog. initial
Блок заканчивается после последнего назначения x
.
Однако always
блок продолжает добавлять события в очередь событий, поэтому моделирование никогда не заканчивается.
Добавление второго initial
блока с $finish
завершением моделирования завершается, независимо от бесконечного always
блока.