Synopsys VCS仿真行为

时间:2017-10-26 08:46:20

标签: verilog synopsys-vcs

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

我对它如何处理0-> 1或1-> 0转换感到困惑。我认为,出于评估目的,0-> 1转换实际上被视为0,而1-> 0被视为1.我希望我的SIM中的这种行为能够使我的设计正常运行。

但是对于我的生活,我无法弄清楚为什么它将生成的输入刺激'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)。

模拟与我期待的相反,除非我稍微延迟了我认为不是理想解决方案的启动。

期待这样的行为是不对的?如果不是,那我该怎么办呢?任何见解将不胜感激。

如果您需要更多详细信息,请与我们联系.TIA

1 个答案:

答案 0 :(得分:0)

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

如果为clk分配一个阻塞语句(=),为en分配一个非阻塞语句(<=),则不会出现争用情况。这是正确的编码样式。然后,您唯一需要记住的是en的采样值,d是时钟边沿的左侧。 – Greg 17年10月26日14:44