【问题标题】:Filling the Gaps on Verilog/System Verilog填补 Verilog/System Verilog 的空白
【发布时间】:2013-06-05 14:16:59
【问题描述】:

我浏览了一些 Verilog 教程并复习了几次主题,自这些概念首次引入以来,我的脑海中一直萦绕着一些问题,如果有人能阐明它们,那将非常有帮助。

  1. 网中力量的目的是什么?
  2. 在示例参数中,通常使用确切的名称来描述寄存器。例如:

    module x (…,in1,…);
    …
    input in1;
    reg [7:0] in1; 
    …
    endmodule 
    

    这是否将输入端口声明为一种数据类型,或者它们是分开的?如果前者是真的,我可以用哪些其他类型的量(整数、标量等)来做这件事?如果后者是真的,当我在模块内说“in1”时,我指的是哪个项目?

  3. 模拟开始时的初始块都以“并行”方式执行,但当您在块内时,指令将串行执行。您使用的模拟工具是否确定串行执行指令的执行顺序?例如,您有 2 个初始块,我们是先执行所有块,还是来回跳转?

4 .为什么模拟X中的初始值?如果 Verilog 的工作是代表现实生活,为什么它没有一个伪随机引擎并在开始时为所有值选择相同的随机位顺序?您会遇到很多关于独特案例语句警告的问题,这似乎是设计缺陷,或者至少是系统 Verilog 和 Verilog 之间的不协调。

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:
    1. 让您在网络上有多个驱动程序并确定结果信号的值;参见 LRM 中的 7.10
    2. 它们都是一样的in1 - 非常冗长。在 V-2001 中,您可以改为在端口列表中写入单个 input reg[7:0] in1。您可以对通过端口连接的任何设备执行此操作。
    3. 请注意,initial 不保证在 always 之前执行,并且在您的设计中的任何 initial/always 块之间不保证执行顺序。在实践中,模拟器选择一个块,并执行它直到它到达一个挂起点(一个时序控制),在这个点上,sim 安排另一个初始或总是,并执行它直到它挂起,依此类推。
    4. 这本质上是哲学,但为什么要为任何东西分配初始随机值?这基本上就是“未知”(X)的意思(或网络的 Z)。如果在开始的时候一切都是 X 或 Z,那么你就知道它是未初始化的,并且会一直保持下去,直到你对它做些什么。如果该工具为所有内容提供初始随机有效值,您将永远不会知道。

    【讨论】:

    • 如果所有内容都有一个初始随机值,您将不会收到大量关于您的唯一案例块没有匹配案例的运行时警告,因为您正在测试的值是未知的。 .我去看看那个 LRM,谢谢!
    • 您可以查找 casex/casez 以查找匹配的未知数,或者推迟案例测试直到所有内容都初始化,或者忽略 time-0 警告 - 只给所有内容一个非 x 默认值不会是好主意。除此之外,您的模拟人生将无法重复。
    • 7.10 的 LRM 被标记为“队列”。这是您打算让我阅读的部分吗?我避免独特案例运行时警告问题的方法是使用“-xlrm uniq_prior_final”进行编译,它会延迟检查独特案例语句,直到时间步结束。效果很好,我只是好奇他们是否因为两种语言之间的不协调而必须实现此开关。
    • @ScottJamesWalter EML 指的是 IEEE1364-2001 的第 7.10 节。在 IEEE Std 1800-2012(免费standards.ieee.org/getieee/1800/download/1800-2012.pdf)中,它是第 28.10 到 28.15 节(很多细节和示例)。
    • 初始块不用于对真实硬件进行建模,这是一种可综合的设计。设计人员应始终使用灵敏度列表和监视复位或一些特殊信号来复位硬件状态,而不是在初始块中使用语句。初始块应用于模拟环境或测试平台的一些准备,而不是实际设计建模本身。
    【解决方案2】:
    1. 如果发生争用,强度有助于解析为已知值。上次我在设计中看到这样的东西是 10 年前的事了。即便如此,它也被认为是一种糟糕的设计实践。

    2. 正如 EML 所说。

    3. No 和 No. 任何程序块(例如初始块)中的语句在同一时隙内按顺序执行。初始块在时间 0 开始执行。模拟器按照 Verilog 事件队列按照它们出现在初始块中的顺序执行所有语句。变量根据事件队列规定的时间表进行更新。所有这些都是标准的一部分(LRM 8.10)。如果您不熟悉 verilog 事件队列以及时隙和模拟时间的概念,那么 Cliff Cumming's paper 是一个很好的参考。模拟器是否从交错的不同初始块或任何其他方式执行语句都没有关系。模拟时间不会提前,变量仅根据事件队列更新。

      不标准的是模拟器应该从哪个初始块开始。这变得很重要,因为如果变量在一个初始块中分配并在同一事件队列中的另一个程序块中使用,这将创建对模拟器的依赖性。上面引用的 Cumming 的论文很好地解释了这种情况。

    4. 这不仅仅是网络的未解决状态。但也关于从可预测的状态开始模拟。因此,随机选择设计输入的解析状态不会提供每次从同一点启动模拟器的可预测性。除了 EML 的建议外,您还可以使用 SystemVerilog 中提供的 2-state 数据类型。当然,这些是不可合成的。因为,为了准确地建模硬件,如果输入未知,您希望输出状态是未知的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2022-12-13
      • 2015-08-19
      • 1970-01-01
      相关资源
      最近更新 更多