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