System Verilog 仿真与执行

System Verilog simulation versus execution

关于 SystemVerilog (SV) 用于编程芯片和模拟 SV 代码的大量工作。这种语言结构的经济性让我有点困惑:SV Reference 的第 9.2.2 节指出

"There are four forms of always procedures: always, always_comb, always_latch, and always_ff. All forms of always procedures repeat continuously throughout the duration of the simulation."

当然,这些构造还指定了组合逻辑和锁存逻辑的创建。那么 SV 标准是否主要针对仿真,让芯片 OEM 来建议客户哪些 SV 构造将产生实际硬件,正如 Altera 所做的那样 here?

Altera 生产 CPLD 和 FPGA,其中一些并不太贵(因此我有动力学习 SV)。被 Altera 认可为可综合的 SV 结构子集将在 Quartus 中编译成适合下载到芯片的形式。 Altera 将其他构造,例如许多断言(上述参考的第 16 节)标记为 "Supported. Ignored for synthesis.",并以并发断言为例。

因此,根据此处获得的新信息,我的结论是,例如,我可能仅对测试平台模块使用并发断言,但立即断言可用于任何地方。

基本上,我试图了解 SV 的工作原理,以及我如何最好地解释上面引用的 SV 标准。谢谢

Verilog 语言非常低级,因此在为 FPGA 或 ASIC 设计硬件时,我们有组合逻辑和时序逻辑。任何工具中的断言都是为了验证,概念是高层次才能得到你想要的硬件。

SystemVerilog 不仅用于仿真,而且使用正确的设计子集将允许 RTL 和 post 综合门文件在仿真中匹配。您编写 SystemVerilog 设计的方式将决定综合工具生成的内容。触发器和锁存器只有在你暗示它们的情况下才会被创建。不同的工具可能会以不同的方式优化组合部分,但如果使用最佳实践编写,那么它们在功能上应该是等效的。

Verilog in a day gives a guide on design. The SystemVerilog LRM does not split the spec between synthesisable components and verification but the unofficial guide to synthesising SystemVerilog 是一个很好的指南。

关于使用不同 always 块的问题部分。

从 Verilog 我们有:

always @*             // For combinatorial logic
always @(posedge clk) // For flip-flops (sequential) Logic

暗示闩锁涉及不完整的 if/else 分支,很难判断这是意外还是有意为之。

//Latch from bug or actually intended?
always @* begin
  if (enable) begin
    //..
  end
end

System verilog 保留了简单的 always 以便与 verilog 代码向后兼容,但添加了三种类型,以便设计人员可以明确设计意图。

always_comb  //For Combinatorial logic
always_latch //For implying latches
always_ff    //For implying flip-flops (sequential logic)

always_combalways @* 有更严格的规则用于在模拟中触发以进一步最小化 RTL 到门级模拟不匹配。