我在我的测试平台中看到了奇怪的行为,其中非阻塞赋值充当连续赋值,而不是输出延迟一个周期的RHS。
我的测试平台通过bind cache cov cov_top将一个模块"cov“绑定到cpu.cache上的DUT,并且在"cov”模块中有这样的非阻塞赋值:
module cov
import cachePkg::*;
(
input logic clk,
input logic rst
);
clocking cclk @(posedge clk iff !rst); endclocking
logic [1:0] LinkState_d1, LinkState_d2;
always @(cclk) begin
LinkState_d1 <= cache.cntrl.LinkState;
LinkState_d2 <= LinkState_d1;
end
endmodule而DUT中的cache.cntrl.LinkState是非阻塞赋值的输出,所以我认为LinkState_d1会简单地跟随DUT中的LinkState,只是延迟了一个周期。然而,在波形查看器中,我看到LinkState_d1与LinkState完全匹配,就好像它是一个连续赋值一样,这是我在波形中看到的时钟图:
__ __ __
clk __| |__| |__| |__
________
LinkState _____|
________
LinkState_d1 _____|
__
LinkState_d2 ___________|当我们在连续赋值的RHS中使用分层引用时,是否会发生一些不同的情况?或者这只是一个模拟器bug?我正在使用questasim 2019.4
发布于 2021-04-29 01:34:29
您编辑的问题与原始问题有很大不同。问题是你使用了不同的时钟。它与分层引用无关,也与您在模块cov中使用NBA语句无关。
时钟块事件cclk被安排在观察到的区域中,这可能是在cache.cntrl.LinkState用其新值更新之后。
不应将时钟块与来自时钟块外部的信号混在一起。要么停止使用时钟块,要么移动其中的所有内容。
logic [1:0] LinkState_d1, LinkState_d2;
clocking cclk @(posedge clk iff !rst);
input LinkState = cache.cntrl.LinkState;
inout LinkState_d1l
output LinkState_d2;
endclocking
always @(cclk) begin
cclk.LinkState_d1 <= cclk.LinkState;
cclk.LinkState_d2 <= cclk.LinkState_d1;
end
endmodule发布于 2021-04-29 00:27:10
不知何故,时钟模块的使用会影响NBA采样的时间,将always @(cclk)更改为always @(clk)解决了这个问题。
https://stackoverflow.com/questions/67301926
复制相似问题