填补Verilog / System Verilog的空白

时间:2013-06-05 14:17:00

标签: verilog system-verilog

我查看了一些Verilog教程并对这些主题进行了几次回顾,自从概念首次出现以来,一些问题一直困扰在我脑海中,如果有人能够对它们有所了解,那将非常有帮助。

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

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

    这会将输入端口声明为一种数据类型还是它们是分开的?如果前者是真的,那么我可以使用其他类型的数量(整数,标量等)?如果后者是真的我在模块里面说“in1”时指的是哪个项目?

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

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

2 个答案:

答案 0 :(得分:0)

  1. 让您在网络上有多个驱动程序并确定结果信号的值;见LRM中的7.10
  2. 他们都是一样的in1 - 非常冗长。在V-2001中,您可以在端口列表中编写单个input reg[7:0] in1。您可以对通过端口连接的任何内容执行此操作。
  3. 请注意,不能保证在始终执行初始值之前,并且在设计中的任何初始/始终块之间没有保证执行顺序。在实践中,模拟器选择一个块,并执行它直到它到达暂停点(定时控制),此时sim调度另一个初始或总是,并执行直到它暂停,依此类推。
  4. 这基本上是philosphy,但为什么要将初始随机值分配给任何东西?这基本上是'未知'(X)的意思(或网络的Z)。如果在开始的时候一切都是X或Z,那么你知道它是未初始化的,并且在你做某事之前一直如此。如果该工具提供了所有初始随机有效值,您将永远不会知道。

答案 1 :(得分:0)

  1. 如果争用强度有助于解析为已知值。上次我在10年前的设计中看到过这样的东西。即便如此,它被认为是一个糟糕的设计实践。

  2. 正如EML所说。

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

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

  4. 这不仅仅是关于网络未解决的状态。但也是关于从可预测的状态开始模拟。因此,随机选择输入到设计的已解决状态将无法提供每次从同一点启动模拟器的可预测性。除了EML的建议,您可以使用SystemVerilog中提供的2状态数据类型。当然,这些都不是可综合的。因为,要准确建模硬件,如果输入未知,则需要输出状态未知。