系统verilog:如果循环内部始终阻止不执行

时间:2017-10-26 18:50:55

标签: verilog system-verilog

当另一个64位信号(val)的值改变超过阈值时,我写了一段代码来同步断言信号(val_changed)。之后,需要根据第三个信号(adj_in_prog)negedge取消断言此信号。

这里clk和val是块的输入。

logic [63:0] val_reg;

 always @(posedge clk) begin
    val_reg <= val;
 end

 always @(posedge clk) begin
    if ((val - val_reg) > 64'hFFFFF) //Threshold = 64'hFFFFF
          val_changed <= 1'b1;
    @(negedge adj_in_prog);
    val_changed <= 1'b0;
 end

据我所知,上述方法不是最干净的方法,但由于这是测试平台代码,所以我不需要综合这个,想到实验。但是这段代码没有工作,因为val_changed没有进行1.我想知道为什么if循环不会执行。按照我的说法,val_changed应该在标记位于附加波形中的时钟边缘变高。有人可以帮忙吗? (波形值以十六进制表示)

waveform (values in hex)

1 个答案:

答案 0 :(得分:1)

在你的情况下,在clk的第一个构成中,第二个始终阻止开始执行并处理&#39;如果&#39;声明。然后它坚持@(negedge adj_in_prog)语句,等待事件。在下一个时钟边沿,它将继续等待,不会重新进入并评估“如果&#39;声明,等等。所以,这就解释了为什么它没有进展。

所以,假设adj_in_progval_changed更改为1时启用,则以下内容适用于您。

always @(posedge clk) begin
    if ((val - val_reg) > 64'hFFFFF) //Threshold = 64'hFFFFF
      val_changed <= 1'b1;
    else if (!adj_in_prog);
      val_changed <= 1'b0;
end