很多人都对SystemVerilog(SV)用于编程芯片和模拟SV代码。这种语言结构的经济性给我带来了一些困惑:SV参考文献的第9.2.2节陈述
“总是有四种形式的程序:always,always_comb,always_latch和always_ff。所有形式的always程序在整个模拟过程中都会连续重复。”
当然,这些结构当然也指定了组合和锁存逻辑的创建。 SV标准主要针对仿真,让芯片OEM厂商建议哪些SV结构会产生实际硬件,就像Altera已经完成here一样?
Altera制造CPLD和FPGA,其中一些并不太昂贵(因此我开始学习SV)。由Altera祝福的SV构造子集可合成将在Quartus中编译成适合下载到芯片的形式。 Altera标记其他构造,例如许多断言(上面引用的第16节),“支持。忽略合成”。以并发断言为例。
因此,我的结论是,在此处获得的新信息之后,我可以使用例如仅针对测试平台模块的并发断言,但是可以在任何地方使用即时断言。
基本上我试图了解SV如何工作,以及我如何最好地解释上面引用的SV标准。感谢。
答案 0 :(得分:7)
Verilog语言水平很低,因此在为FPGA或ASIC设计硬件时,我们有组合逻辑和顺序逻辑。任何工具中的断言都是真正用于验证的,概念是高级别的,以便能够获得您想要的硬件。
SystemVerilog不仅适用于仿真,而且使用正确的设计子集将允许RTL和后合成门文件在仿真中匹配。编写SystemVerilog设计的方式将决定合成工具生成的内容。只有在您隐含它们时才会创建触发器和锁存器。不同的工具可能会对组合部分进行不同的优化,但如果使用最佳实践编写,那么它们应该在功能上都是等效的。
Verilog in a day提供设计指南。 SystemVerilog LRM不会在可合成组件和验证之间拆分规范,但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
系统verilog保留了简单的always
以便与verilog代码向后兼容,但添加了三种类型,因此设计人员可以明确设计意图。
always_comb //For Combinatorial logic
always_latch //For implying latches
always_ff //For implying flip-flops (sequential logic)
always_comb
具有比always @*
更严格的规则,用于触发仿真,以进一步最小化RTL与门级仿真不匹配。