监视器语句verilog

监视器语句verilog,verilog,Verilog,删除#2 reset after monitor语句使代码无法工作。输出仅为0 x。然而,包括它工作得很好。为什么? module counter(out,clock,reset); input clock,reset; wire clock,reset; output [3:0]out; reg [3:0]out; always @(posedge clock or negedge clock) begin if(reset) out<=1'b0; else out

删除#2 reset after monitor语句使代码无法工作。输出仅为0 x。然而,包括它工作得很好。为什么?

module counter(out,clock,reset);
input clock,reset;
wire clock,reset;
output [3:0]out;
reg [3:0]out; 
always @(posedge clock or negedge clock)
begin
if(reset)
    out<=1'b0;  
else
    out<=out+1;
end
endmodule

module tb();
reg clock,reset;
output [3:0]out;
counter c(out,clock,reset);
initial
begin
    clock=0;
    reset=1;
end
initial
begin
    $monitor("%d %d",$time,out);
    #2 reset=0;
end
always
    #1 clock=~clock;
initial
    #100 $finish;
endmodule
模块计数器(输出、时钟、复位);
输入时钟,复位;
有线时钟,复位;
输出[3:0]输出;
注册[3:0]输出;
始终@(posedge时钟或negedge时钟)
开始
如果(重置)
通过移除
#2
退出,您可以在
重置时创建竞态条件:

initial reset = 1;
initial reset = 0;
模拟器的最终值通常为
reset
编译顺序中读取的最后一个赋值。尝试合并初始块:

initial
begin
    $monitor("%d %d",$time,out);
    clock=0;
    reset=1;
    #2 // <-- optional (and still recommened) if you make the below change
    // @(clk) //<-- if you truely want a dual edge triggered flip-flop with synchronous reset
    reset=0;
end
与:


你为什么推断这是一个双面翻牌?您是否打算进行异步重置?从监视器中删除$time,这样做有效吗?出现问题的原因是$time在不断变化,而$monitor正在无限地调用。此外,您应该只有一个初始块。其他的应该总是块或者可能是fork/join。@Russell,
$time
不是
$monitor
的问题,它是一种特殊情况,因为它不会触发事件。
always @(posedge clock or negedge clock)
always @(negedge clock or posedge reset)