Сигналы не возвращаются из исходного состояния на испытательном стенде Verilog - PullRequest
0 голосов
/ 18 мая 2018

Я работаю с системой из двух 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 Ответ

0 голосов
/ 18 мая 2018

This:

initial
begin
   $display("end of main module");
   $finish;
end

убивает вашу симуляцию, так как все начальные операторы выполняются в параллельно .Удалите его и поместите $ finish или $ stop в конце основного инициала.
Также лучше перенести все назначения 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
...