首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非阻塞分配中的SystemVerilog分层引用

非阻塞分配中的SystemVerilog分层引用
EN

Stack Overflow用户
提问于 2021-04-28 22:11:52
回答 2查看 45关注 0票数 0

我在我的测试平台中看到了奇怪的行为,其中非阻塞赋值充当连续赋值,而不是输出延迟一个周期的RHS。

我的测试平台通过bind cache cov cov_top将一个模块"cov“绑定到cpu.cache上的DUT,并且在"cov”模块中有这样的非阻塞赋值:

代码语言:javascript
复制
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完全匹配,就好像它是一个连续赋值一样,这是我在波形中看到的时钟图:

代码语言:javascript
复制
             __    __    __
clk       __|  |__|  |__|  |__
                   ________
LinkState    _____|
                   ________
LinkState_d1 _____|
                         __
LinkState_d2 ___________|

当我们在连续赋值的RHS中使用分层引用时,是否会发生一些不同的情况?或者这只是一个模拟器bug?我正在使用questasim 2019.4

EN

回答 2

Stack Overflow用户

发布于 2021-04-29 01:34:29

您编辑的问题与原始问题有很大不同。问题是你使用了不同的时钟。它与分层引用无关,也与您在模块cov中使用NBA语句无关。

时钟块事件cclk被安排在观察到的区域中,这可能是在cache.cntrl.LinkState用其新值更新之后。

不应将时钟块与来自时钟块外部的信号混在一起。要么停止使用时钟块,要么移动其中的所有内容。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-04-29 00:27:10

不知何故,时钟模块的使用会影响NBA采样的时间,将always @(cclk)更改为always @(clk)解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67301926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档