\qquad
我们知道Verilog HDL具有很强的电路描述和建模能力,能从多个层次对数字系统进行描述和建模,它是建立在硬件电路的基础上的。因此可综合语句指的是可以通过综合工具映射为实际的电路的描述语句。
\qquad
我个人主要使用Altera/Intel平台的FPGA,下面主要以Quartus综合工具支持的可综合语句为例:
1.Data Types 数据类型
\qquad
支持除real和realtime 以外的网和变量,可支持以下数据类型:
\qquad
reg
\qquad
integer
\qquad
time
\qquad
vectored
\qquad
wire
\qquad
tri
\qquad
tri0
\qquad
tri1
\qquad
trior
\qquad
triand
\qquad
wor
\qquad
wand
\qquad
supply0
\qquad
supply1
\qquad
parameter
\qquad
localparameter
\qquad
对于逻辑强度声明语句,包括驱动强度(strong0,strong1,pull0,pull1,weak0,weak1,highz0,highz1)、电荷储存强度(large,medium,small)声明语句则会被综合工具会忽略,不会综合成实际电路。
2.Expressions 表达式
\qquad
操作符:
\qquad
算术法运算符:+(加)、- (减)、*(乘)、/(除)、%(取余)、**(幂)
\qquad
关系运算符:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)、!=(不等于)
\qquad
赋值运算符:=(阻塞赋值)、<=(非阻塞赋值)
\qquad
逻辑运算符:&&(逻辑与)、||(逻辑或)、~((逻辑取反)、^ (逻辑异或)、 ~^(逻辑同或)
\qquad
位运算符:&(按位与)、|(按位或)、~(按位取反)、^(按位异或)
\qquad
移位操作符:>>(逻辑右移)、<<(逻辑左移)、<<<(算术左移)、>>>(算术右移)
\qquad
条件运算符:? :
\qquad
位拼接运算符:{ }
\qquad
支持位选择、内存寻址,但延时表达式会被忽略。
3.Gates and Switchs 门和开关
\qquad
支持and,nand,nor, or, xor, xnor,not,buf,bufif1, bufif0, notif1, notif0。
\qquad
不支持MOS/CMOS开关(nmos、pmos、rnmos、rpmos、cmos、rcmos)、双向开关(tran、tranif0、tranif1、rtran、rtanif0、rtanif1)、上拉/下拉源(pullup、pulldown)。
\qquad
可以看出Quartus对门级建模似乎不是特别友好,当然这也是大势所趋。
4.User Defined Primitives 用户自定义源语
\qquad
支持组合逻辑原语、电平敏感的顺序执行原语、边沿敏感的顺序执行原语
5.Behavioral Modeling 行为级建模
\qquad
支持阻塞赋值、非阻塞赋值,不支持连续赋值和中断连续赋值、强制赋值和释放强制赋值
\qquad
支持行为块(initial、always)、支持顺序执行块(begin……end)、不支持并行执行块(fork……join)
6.Task and Function 任务与函数
\qquad
支持Task、仅当函数内部变量为函数内部局部变量时支持。
7.Hierarchical Structures 多级结构
\qquad
支持模块(modules)、参数值(参数定义声明、模块实例化参数赋值)、端口。
8.Disable Statement 禁用声明
\qquad
支持禁用声明(disable)。
9.Specify Blocks 路径延时
\qquad
综合工具会忽略路径延时声明。
\qquad
参照IEEE标准1364-2001的第14节 Specify Block
10.System Task and Function 系统任务和函数
\qquad
支持系统显示任务()、支持文件输入/输出任务(仅支持$readmemb、$readmemh)
\qquad
不支持时间尺度任务()、仿真控制任务()、时序检查任务()、PLA建模任务()、随机分析任务()、仿真时间任务()、实数转换函数()、随机分布函数()
\qquad
相关的系统任务和函数请参照IEEE标准1364-2001的第17节system task and function列出的相关函数列表。
11.Compiler Directives 预编译指令
\qquad
支持`define、`undef、`ifdef、`else、`endif、`incluce、`resetall、`unconnect_drive、`onunconnect_drive
\qquad
综合工具会忽略`timescale
\qquad
不支持`celldefine、 `endcelldefine
\qquad
具体可对照IEEE标准1364-2001的第19节Complier directives和Quartus的help文档。
\qquad 官网标准文档和综合工具帮助文档是最有力的学习资料,一定要好好利用,网上的资源质量层次不齐,要学会分辨。对于Quartus综合工具支持的可综合语句可将Quartus帮助文档和IEEE标准1364-2001对照起来看,理解起来会更清晰。
参考文献
[1] IEEE Computer Society. Design Automation Standards Committee, Board I S . IEEE Standard Verilog Hardware Description Language[C], IEEE Std 1364-2001. IEEE, 2001.
[2] Intel. Intel® Quartus® Prime Pro Edition Help[EB/OL].2021-10-15.