当另一个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应该在标记位于附加波形中的时钟边缘变高。有人可以帮忙吗? (波形值以十六进制表示)
答案 0 :(得分:1)
在你的情况下,在clk的第一个构成中,第二个始终阻止开始执行并处理&#39;如果&#39;声明。然后它坚持@(negedge adj_in_prog)语句,等待事件。在下一个时钟边沿,它将继续等待,不会重新进入并评估“如果&#39;声明,等等。所以,这就解释了为什么它没有进展。
所以,假设adj_in_prog
在val_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