我刚刚开始使用VCS编译和模拟用verilog编写的TB。
我很困惑它是如何对待0->1或1->0的。我相信,为了评估的目的,0->1的转换实际上被看作是0,1->0被看作是1。我希望在我的sims中,这种行为会使我的设计行为正确。
但在我的一生中,我不明白为什么它将生成的输入刺激‘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现在发生的情况是,当事件被触发时,即在en上发生0->1的转换,然后我希望触发器仍然是0和触发器d。而在en的下降边缘(与clk的另一个前缘相吻合),我需要确保触发器不会发生(它应该被看作是1)。
这些模拟所做的与我所期望的相反,除非我稍微推迟了en触发,我认为这不是理想的解决方案。
期望这样的行为是错误的吗?如果没有,那我怎么解决这个问题呢?任何见解都将不胜感激。
如果你需要更多的details.TIA,请告诉我
发布于 2020-09-29 01:00:08
将Greg的评论提出来回答,这样就可以将这个问题标记为已回答:
如果使用阻塞语句(=)分配clk,用非阻塞语句(<=)分配en,则不会出现争用条件。这是正确的编码方式。那么,唯一需要记住的是en和d的采样值,如果时钟边缘是左边的。-格雷格10月26日下午14:44
https://stackoverflow.com/questions/46949667
复制相似问题