这门课接下来会花30页slides的篇幅介绍可综合的SV语法。下面的报告来自Synopys User Group meeting in Silicon Valley in 2013.
链接如下
Slidessutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_presentation.pdf
Paperssutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf
标题就非常霸气。“打破SystemVerilog仅用于验证的荒谬说法”。
首先梳理一下大纲:
- 揭穿一个关于SystemVerilog的荒谬说法
- SV中哪些是可综合的
- 这些可综合的结构为什么是重要的
- Design Compiler以及Synplify-Pro是如何支持SV综合的
- 15个用于可综合SV的编码习惯
So,Let's get started!
第一个误区,Verilog是一门设计语言,而SV是一门验证语言,综合器不支持SV。
- 非常错误的说法。SV相较于传统的Verilog而言,既提高了设计能力,有提高了验证能力。
- 从技术角度出发,现在已经没有Verilog这个东西了。IEEE在2009年将其更为Systemverilog。所以我们可以认为我们平常写的Verilog,都是SV的一部分。
- VCS、DC、Synplify-Pro对于SV的RTL建模有着非常好的支持。
上述是SV增加的一些特性。
SV的设计目标如下:
- 用更少的代码实现更多的功能
- 降低冗余度
- 降低编码错误导致的风险
新增加的可综合数据类型,以下三种用的非常多
- logic——4态逻辑,用户自定义长度,用于替代reg变量
- enum——拥有一组特定编码的变量,上节课其实已经详细介绍了。
- int——32bit的2值逻辑变量,用于循环操作,替代integer。因为我们做循环,只有0或者1,x和高阻态其实是不起作用的,用int可以节省资源开销,并且不传播X态
还有一些其他的变量,用的比较少。这里不详细介绍。但是有一点需要特别注意,二值变量除了int用作循环以后,其它的不要用在可综合模块中,不然无法传播X态,导致Debug不出潜在的问题,很危险(比如忘了写赋初值的逻辑,这种2态会默认0,但实际上这是很危险的,实际电路中这是一个不确定的状态)。
传统的Verilog对于端口有着严格和令人迷惑的规则:
- 输入端口必须是线网类型(wire)
- 输出根据赋值逻辑块的不同使用reg或者wire(尤其是reg逻辑变量,实际上并不一定生成寄存器,这对于初学者而言非常恶心,很容易导致困惑)
SV中就简单多了,一律用logic就可以,SV会自动解析这是个变量还是一个线网。(在多驱和双向逻辑中需要用wire,但是初学者前期应该接触不到,这里暂时不用管)
接下来介绍了两页enum,上节课已经介绍过了,不重复介绍。
然后介绍了Struct关键词,用于将多组变量绑定在一起。我简单介绍一下其应用场景,比如寄存器共有32bit,但是有不同的filed表示不同的意义。这种情况就可以用struct,来显式的去说明,而不用赋值的时候要小心翼翼的去给指定bit赋值。(这些场景还是很好用的,但是很有可能公司领导不让你用这个关键词,-_-)。
typedef用的不太多,大部分情况是用于struct的重命名。