VERILOG综合心得

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hale Waihona Puke Baidu
可综合性说明
module mocromodule

wire reg integer 数据类型

parameter

端口类型
input output inout 运算符
+、-、*、% & 、~& 、| 、~| 、^ 、^~
= = != && || | ~ & | ^ ^~ >> << ?: { }

大部分可以综合 全等运算符(= = = != =)不支持 多数工具对除法(/)和求模(%)有限制 如对除法操作,只有除数是常数,且是 2 的
在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值,虽然同时 这两种赋值方
式在综合时并不一定会出错。
3、 在向函数的返回值赋值时,应该使用阻塞赋值“=”。 4、 不能在一个以上的“always”过程块中对同一个变量赋值,这样会引起冲突,在综合时
会报错。
5、 在一个模块中,严禁对同一变量既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会 报错。
if- else case casez casex endcase for 循环语句
always 过程语句 begin-end 块语句 function endfunction
task endtask 编译向导:`include `define `ifdef `else `endif
支持,但对同一 reg 型变量只能采用阻塞和非 阻塞赋值中的一种进行赋值
指数时才支持
基本元件
and nand nor or xor xnor buf not bufif1 bufif0 notif1 notif0 pullup pulldown
全部可综合: 但某些工具对取值为 x 和 z 有所限制
持续赋值 assign

1
过程赋值:阻塞赋值(=) 非阻塞赋值(<=) 条件语句
initial 过程块中的语句仅执行一次,而 always 块中的语句是不断重复执行的。 编写顶层模块的注意事项
每个端口除了要声明是输入 、输出还是双向外,还要声明其数据类型,是连线型(wire) 还是寄存器型(reg),如果没有声明则综合器默认为 wire 型。 1、 输入和双向端口不能声明为寄存器型。 2、 在测试模块中不需要定义端口。
deassign defparam event
force
release
fork join
rpmos
多数综合器对这些结构和语句不支持, 用这些语句描述的程序代码不能转化 为具体的电路网表结构,但这些结构能
forever repeat while
够被仿真工具所支持。
initial
rtran tran tranif0 tranif1 rtranif0 rtranif1
4、尽量采用同步方式设计电路。
5、除非是关键路径的设计,一般不调用门级元件来描述设计的方法,建议采用行为语句来
完成设计。
6、用 always 过程块描述组合逻辑,应在信号敏感列表中列出所有的输入信号。
7、所有的内部寄存器都应该能够被复位,在使用 FPGA 实现设计时,应尽量使用器件的全
局复位端作为系统总的复位。
一般支持,有的综合器不支持 casex casez 是

是 一般支持,少数综合器不支持

一般综合工具忽略的 Verilog HDL 结构
Veriolg HDL 结构
可综合性说明
延时控制
scalared
vectored
specify
这些结构和语句在综合时全被忽略
small large medium
weak1 weak0 highz0 highz1 pull0 pull1
综合:不可综合的运算符:= = = ,!= =,/(除法),%(取余数)。
Verilog HDL 语句及可综合性:
类别
语句
可综合性
initial

过程语句
begin

串行块 begin - end

块语句
并行块 fork-join

持续赋值 assign

赋值语句
过程赋值 =、<=

if – else
3
table endtable primitive endprimitive
移位运算符:Verilog HDL 提供向右(>>)及向左(<<)两种运算符,运算符高位或地位一旦 移出即予丢弃,其空缺的位则予以补零。
连续赋值语句(assign)、case 语句、if…else 语句都是可以综合的 initial 语句内若包含有多个语句时,必须以 begin end 作聚合;单一的初值赋值,因此并不 需以 begin end 做聚合。 循环(Loops) 并不能单独地在程序中存在,而必须在 initial 和 always 块中才能使用。
time
有些综合工具将其视为整数(integer)
wait
有些综合工具有限制地支持
一般综合工具不支持的 Verilog HDL 结构
Verilog HDL 结构
可综合性说明
在 assign 持续赋值中,等式左边含有变量的位选择
全等运算符(= = =、!= =)
cmos
nmos rcmos rnmos pmos
6、 对时序逻辑描述和建模,应尽量使用非阻塞赋值方式,此外,若在同一个“always”过 程块中描述时序和组合逻辑混合电路时,也最好使用非阻塞赋值方式。
7、 对于阻塞赋值来说,赋值语句的顺序对最后的综合结果有着直接的影响。 而对于非阻塞赋值,不用考虑赋值语句的排列顺序。
布局与布线(Auto Placement & Route, AP&R) 布局的目的在于产生制作掩膜所需的 GDSII 文件。 CTS(时钟树综合)必须尽可能地使同一个 Tree 内 Clock 到达的时间一致,即使 Clock Skrew 越小越好。

条件语句
case , casez , casex

for

repeat

循环语句
while

forever

`define

编译向导语句
`include

`ifdef, `else , `endif

可综合设计的特点:
1、不使用初始化语句。
2、不使用带有延时的描述。
3、不使用循环次数不确定的循环语句,如:forever、while 等。
阻塞赋值(=)和非阻塞赋值(<=)的应用注意事项: 1、 非阻塞赋值不能用于“assign”持续赋值中,一般只出现在“initial”和“always”等过
程块中,对 reg 型变量进行赋值。象 assign out<=a+b;这样的语句是错误的。 2、 当用“always”块来描述组合逻辑时,既可以用阻塞赋值,也可以采用非阻塞赋值。但
net 型和 reg 型的变量可以声明为(signed)变量;操作数可以从无符号数转换为有符号数。
例如: wire signed[3:0] a; reg signed[7:0] out;
系统函数$signed 和$usigned,以实现无符号数转化为有符号数,或者有符号数转化为无符
号数。
例如:c=$signed(s);
算术移位操作符:‘>>>’, ‘<<<’,对于有符号数,执行算术移位操作的时,将符号填补移出
的位。例如:定义有符号数:8’b10100011,则执行逻辑移位操作和算术移位操作后的值分
别如下:
A>>3;
//逻辑右移后其值为:8’b00010100
A>>>3;
//算术右移后其值为 8’b11110100
编写 testbentch 所归纳的心得
2
module 模块名称; 将 input 定义为 reg; 将 output 定义为 wire; 引用欲测试的 module 别名 initial begin 设定 reg 初始值 end always 处理变化值 endmodule
在 always 、initial 过程块内,被赋值的每一个信号都必须定义成寄存器型。
8、在 verilog 模块中,任务(task)通常被综合成组合逻辑的形式,每个函数(function)在 调用时通常也被综合为一个独立的组合电路模块。
9、用户自定义原语(UDP)是不可综合的,它只能用来建立门级元件的仿真模型。
一般综合工具支持的 Verilog HDL 结构
Verilog HDL 结构
相关文档
最新文档