作为HDL语言,有两种基本的用途:系统仿真和设计实现。所有的HDL描述都可用于仿真,但并非所有的HDL描述都可综合。
一般综合工具支持的Verilog HDL结构
Verilog HDL结构 | 可综合性说明 |
module,macromodule | √ |
wire,reg,integer 数据类型 | √ |
parameter | √ |
端口类型说明 input,output,inout | √ |
运算符 +,-,*,% &,~&,|,~|,^,^~ ==,!=,&&,||,! ~,&,|,^,^~ >>,<<,?:,{} | 大部分可综合: 全等运算符(=== !==)不支持: 多数工具对除法(/)和求模(%)有限制; 如对除法操作,只有当除数是常数,且是2的指数时才支持; |
基本门元件 and,nand,nor,or,xor,xnor,buf,not, bufif0,bufif1,notif0,notif1,pullup,pulldowm | 全部可综合 但某些工具对取值x和z有所限制 |
持续赋值 assign | √ |
过程赋值: 阻塞赋值( = ) 非阻塞赋值( <= ) | 支持,但对同一reg型变量只能采样阻塞和非阻塞赋值的其中一种进行赋值 |
条件语句: if-else,case,casex,casez,endcase | 一般支持,但有的综合不支持casex,casez |
for循环语句 | √ |
always 过程语句 begin-end 块语句 | √ |
function,endfunction | √ |
task,endtask | 一般支持,少数综合器不支持 |
编译向导: `include,`define,`ifdef,`else,`endif | √ |
一般综合工具忽略的Verilog HDL结构
Verilog HDL结构 | 这些结构和语句在综合时全被忽略 |
延时控制 #xxx | |
scalared, vectored | |
specify | |
small, large, medium | |
weak0,weak1,highz0,highz1,pull0,pull1 | |
time | |
wait |
一般综合工具不支持的Verilog HDL结构
Verilog HDL结构 | 可综合性说明 |
在assign持续赋值中,等式左边含有变量的位选择 | 多数综合器对这些结构和语句不支持,这些语句描述的程序代码不能转换为具体的电路网表结构,但这些结构都能够被仿真工具(如ModeSim等)所支持 |
全等运算符===,!== | |
cmos,nmos,rcmos,rnmos,pmos,rpmos | |
deassign,defparam,event | |
force,release | |
fork,join | |
forever,while,repeat | |
rtran,tran,tranif0,tranif1,rtranif0,rtranif1 | |
initial | |
table,endtable,primitive,endprimitive |
可综合设计的要点
- 不使用初始化语句。
- 不使用带有延时的描述。
- 不使用循环次数不确定的循环语句,如forever、while等。
- 尽量采用同步方式设计电路
- 除非是关键路径设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
- 用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
- 所有的内部寄存器都应该能够被复位,应尽量使用器件的全局复位端作为系统总的复位。
- 用户自定义原语(UDP元件)是不可综合的,它只能用来建立门级元件的仿真模型。