Verilog enable的模拟行为

Verilog enable的模拟行为,verilog,Verilog,我刚刚开始使用VCS编译和模拟用verilog编写的TB 我被它如何处理0->1或1->0转换所困扰。我认为出于评估目的,0->1转换实际上被视为0,1->0被视为1。我希望我的模拟人生中的这种行为能让我的设计正常运行 但就我的一生而言,我不明白为什么它会将生成的输入刺激“0->1”转换视为1,将1->0视为0 下面是与此相关的代码部分。这是一个简单的触发器,带有一个使能信号——“en”,它是从同一时钟clk控制的事件中随机触发的输入刺激。clk在TB和设计中无处不在 always @(pose

我刚刚开始使用VCS编译和模拟用verilog编写的TB

我被它如何处理0->1或1->0转换所困扰。我认为出于评估目的,0->1转换实际上被视为0,1->0被视为1。我希望我的模拟人生中的这种行为能让我的设计正常运行

但就我的一生而言,我不明白为什么它会将生成的输入刺激“0->1”转换视为1,将1->0视为0

下面是与此相关的代码部分。这是一个简单的触发器,带有一个使能信号——“en”,它是从同一时钟clk控制的事件中随机触发的输入刺激。clk在TB和设计中无处不在

always @(posedge clk or negedge reset_) begin
  if (!reset_) begin
    q <= {5{1'b0}};
  end else begin
    if (!en) begin
      q <= d;
    end 
  end
end
始终@(posedge clk或negedge重置)开始
如果(!reset_)开始

q提出Greg对答案的评论,以便将此问题标记为已回答:


如果使用阻塞语句(=)分配clk,使用非阻塞语句分配en,则不会出现竞争条件(如果您同时使用
clk
切换
en
,则会导致竞争条件。触发器的行为高度取决于模拟器,您可能会得到意外的结果。稍微延迟
en
信号(以及其他输入,如果有)这确实是一个很好的解决方案。如果您使用阻塞语句(
=
)分配
clk
)并使用非阻塞语句(
谢谢Greg。它可以工作!并且一致。如果不是注释,您会将其标记为答案