0

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

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

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

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

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

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

4

2 回答 2

0
  1. 让您在网络上有多个驱动程序并确定结果信号的值;见 LRM 中的 7.10
  2. 它们都是一样的in1——非常冗长。在 V-2001 中,您可以在端口列表中写入一个input reg[7:0] in1。您可以对通过端口连接的任何内容执行此操作。
  3. 请注意,不保证 initial 会在 always 之前执行,并且在您的设计中的任何 initial/always 块之间没有保证的执行顺序。在实践中,模拟器选择一个块,并执行它直到它到达一个挂起点(一个时序控制),在这个点上,sim 调度另一个初始或总是,并执行它直到它挂起,依此类推。
  4. 这本质上是一种哲学,但是为什么要为任何东西分配初始随机值呢?这基本上就是“未知”(X)的意思(或网络的 Z)。如果在开始的时候一切都是 X 或 Z,那么你就知道它是未初始化的,并且会一直保持下去,直到你对它做点什么。如果该工具为所有内容提供了初始随机有效值,您将永远不会知道这一点。
于 2013-06-05T15:03:06.993 回答
0
  1. 如果发生争用,强度有助于解决到已知值。上次我在设计中看到这样的东西是 10 年前的事了。即便如此,它也被认为是一种糟糕的设计实践。

  2. 正如 EML 所说。

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

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

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

于 2013-07-31T21:22:59.307 回答