Сигналы не возвращаются из исходного состояния на испытательном стенде Verilog
Я работаю с системой из двух d_flipflops (DFF), соединенных друг с другом (с выходом q первого DFF, подключенного ко входу d второго триггера. Я создал подмодули DFF и встроил их в верхний модуль. Затем я создал тестовый стенд. Однако проблема в том, что моделирование не выходит за рамки исходного состояния независимо от предоставленных мною задержек. В нем говорится, что моделирование завершено при t=0. Хотя при компиляции ошибки нет, я Я не пытался понять, что не так с моим кодом. Я также пытался указывать абсолютные значения времени как задержки в тестовом стенде (например, #50 нс вместо #50), но безрезультатно. Я пытался смоделировать это в iverilog, а также пробовал другие компиляторы из EDAplayground. окажи мне большую помощь, если кто-нибудь сможет рассказать о моей проблеме. Спасибо!
module d_ff(d, clk, reset, q, q_not);
input d, clk, reset;
output q, q_not;
reg q, q_not;
always @ (reset or posedge clk)
begin
if (reset == 0)
begin
q<=d;
q_not <= ~d;
end
else
begin
q<=1'b0;
q_not <= 1'b1;
end
end
endmodule
module main(d, clk, reset, q2, q2_not, q1_not);
input d, clk, reset;
output q2, q2_not, q1_not;
wire d2;
d_ff dup(.d(d), .clk(clk), .reset(reset), .q(d2), .q_not(q1_not));
d_ff dup2(.d(d2), .clk(clk), .reset(reset), .q(q2), .q_not(q2_not));
initial
begin
$display("end of main module");
$finish;
end
endmodule
Вот испытательный стенд:
// Code your testbench here
// or browse Examples
`timescale 1 ns / 100 ps /// 100ps
module main_tb;
reg d, clk, reset;
wire q2, q2_not, q1_not;
main UUT(.d(d), .clk(clk), .reset(reset), .q2(q2), .q2_not(q2_not), .q1_not(q1_not));
initial
begin
clk = 0;
d=1'b0;
reset=1'b1;
#500ns reset=1'b0;
end
always begin
#50ns clk = !clk;
end
initial
begin
$dumpfile("dump.vcd");
$dumpvars;
end
initial
begin
$monitor("clk = %b, d=%b, reset=%b, q=%b, q_not=%b, d2_not=%b", clk,d,reset, q2,q2_not, q1_not);
#500 reset =1'b1;
#500 d=1'b1;
#500 reset =1'b0;
#500 d=1'b0;
#500 reset = 1'b0;
#500 d=1'b0;
#500 reset = 1'b0;
#500 d=1'b0;
#500 d=1'b1;
#100 reset =1'b1;
#500 d = 1'b1;
#50000ns $finish;
end
endmodule
1 ответ
Это:
initial
begin
$display("end of main module");
$finish;
end
Убивает вашу симуляцию, так как все начальные операторы выполняются параллельно. Удалите его и поместите $ финиш или $ стоп в конце основного инициала.
Также лучше переместить все назначения clk в блок clk, то же самое с reset и b:
initial
begin
clk = 1'b0;
forever
#50ns clk = !clk;
end
initial
begin
$monitor("clk = %b, d=%b, reset=%b, q=%b, q_not=%b, d2_not=%b", clk,d,reset, q2,q2_not, q1_not);
d=1'b0;
reset=1'b1;
#500ns reset=1'b0;
#500 reset =1'b1;
#500 d=1'b1;
#500 reset =1'b0;
#500 d=1'b0;
...
$finish; // $stop;
end