我查看了一些Verilog教程并对这些主题进行了几次回顾,自从概念首次出现以来,一些问题一直困扰在我脑海中,如果有人能够对它们有所了解,那将非常有帮助。
在示例参数中,通常使用精确名称来描述寄存器。例如:
module x (…,in1,…);
…
input in1;
reg [7:0] in1;
…
endmodule
这会将输入端口声明为一种数据类型还是它们是分开的?如果前者是真的,那么我可以使用其他类型的数量(整数,标量等)?如果后者是真的我在模块里面说“in1”时指的是哪个项目?
模拟开始时的初始块全部以“并行”方式执行,但是当您在块内时,指令将按顺序执行。您正在使用的仿真工具是否确定了串行执行指令的执行顺序?例如,你有2个初始块,我们先执行一个,还是来回跳转?
4.模拟X中的初始值为什么?如果Verilog的工作是代表现实生活,为什么它没有伪随机引擎并且在开始时为所有值选择相同的随机位数?你遇到了很多关于独特案例陈述警告的问题,这似乎是一个设计缺陷,或者至少是系统Verilog和Verilog之间的不协调。
答案 0 :(得分:0)
in1
- 非常冗长。在V-2001中,您可以在端口列表中编写单个input reg[7:0] in1
。您可以对通过端口连接的任何内容执行此操作。答案 1 :(得分:0)
如果争用强度有助于解析为已知值。上次我在10年前的设计中看到过这样的东西。即便如此,它被认为是一个糟糕的设计实践。
正如EML所说。
否和否。任何程序块中的语句(如初始块)都在同一时隙内顺序执行。初始块在时间0开始执行。模拟器按照verilog事件队列中初始块内出现的顺序执行所有语句。变量根据事件队列指定的计划进行更新。所有这些都是标准的一部分(LRM 8.10)。如果您不熟悉verilog事件队列以及时隙和模拟时间的概念,那么Cliff Cumming's paper是一个很好的参考。如果模拟器以交错的方式或以任何其他方式执行来自不同初始块的语句,则无关紧要。模拟时间不会提前,变量只会根据事件队列进行更新。
什么不标准是模拟器应该从哪个初始块开始。这变得很重要,因为如果变量在一个初始块中分配并在同一事件队列中的另一个过程块中使用,则会对模拟器产生依赖性。上面引用的卡明论文很好地解释了这种情况。
这不仅仅是关于网络未解决的状态。但也是关于从可预测的状态开始模拟。因此,随机选择输入到设计的已解决状态将无法提供每次从同一点启动模拟器的可预测性。除了EML的建议,您可以使用SystemVerilog中提供的2状态数据类型。当然,这些都不是可综合的。因为,要准确建模硬件,如果输入未知,则需要输出状态未知。