- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
可综合的Verilog语法子集总汇【荐】.pdf
常用的RTL 语法结构如下:
☆ 模块声明: module……endmodule
☆ 端口声明:input,output,inout (inout 的用法比较特殊,需要注意)
☆ 信号类型:wire,reg,tri 等,integer 常用语for 语句中(reg,wire 时最常用的,一般tri 和integer
不用)
☆ 参数定义:parameter
☆ 运算操作符:各种逻辑操作符、移位操作符、算术操作符大多时可综合的(注:===与!==是不
可综合的)
☆ 比较判断:if……else,case(casex,casez)……default endcase
☆ 连续赋值:assign, 问号表达式(?:)
☆ always 模块:(敏感表可以为电平、沿信号posedge/negedge;通常和@连用)
☆ begin……end (通俗的说,它就是C 语言里的 “{ }” )
☆ 任务定义:task……endtask
☆ 循环语句:for (用的也比较少,但是在一些特定的设计中使用它会起到事半功倍的效果)
☆ 赋值符号:= 和 = (阻塞和非阻塞赋值,在具体设计中时很有讲究的)
可综合的语法时verilog 可用语法里很小的一个子集,用最精简的语句描述最复杂的硬件,这也正是
硬件描述语言的本质。对于做RTL 级设计来说,掌握好上面这些基本语法是很重要。
相信大家在看了这么多了verilog 语法书籍以后一定有点烦了,那么现在我告诉大家一个好消息,对
于一个RTL 级的设计来说,掌握了上面的语法就已经足够了,无论多么牛逼的工程师,在他的代码
里无非也就是上面一些语法而已。当然了,对于一个能够进行很好的仿真验证的代码,一般还需要在
RTL 级的设计代码中添加一些延时之类的语句,比如大家一定知道#10 的作用,就是延时10 个单位
时间,这个语句虽然在仿真的时候是实实在在的延时,但是这个语句在综合后是会被忽略的,也就是
说在我们综合并且布局布线最后烧进FPGA 里,这个#10 的延时是不会在硬件上实现的。所以说,上
面给出的这些语法才是可以最后在硬件上实现的,其它的语法大多会在综合后被忽略。这么一来大家
就要问了,为什么语法书里又要给出这么多的语法呢?呵呵,它们大都是为仿真验证是写testbench
准备的,先点到为止,下集继续!
对于模型(module )的建立,要保证可综合性应该注意:
(1)不使用initial 。(被忽略)
(2 )不使用#10 。(被忽略)
(3)不使用循环次数不确定的循环语句,如forever 、while 等。
(4 )不使用用户自定义原语(UDP 元件)。
(5)尽量使用同步方式设计电路。
(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完
成设计。
(7)用always 过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
(8 )所有的内部寄存器都应该能够被复位,在使用FPGA 实现设计时,应尽量使用器件的全局复位
端作为系统总的复位。
(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞
赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
(10)不能在一个以上的always 过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞
式赋值,又使用非阻塞式赋值。
(11)如果不打算把变量推导成锁存器,那么必须在if 语句或case 语句的所有条件分支中都对变量
明确地赋值。
(12)避免混合使用上升沿和下降沿触发的触发器。
(13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)
控制。
(14)避免在case 语句的分支项中使用x 值或z 值。
但是在仿真验证程序中,一般VerilogHDL 语法都是容许的。
Verilog 语法需要注意的一些要点
1. Testbench 中时钟和数据比特流的简单设计方法
always clock = ~clock;
always @(posedge clock)
begin
data_in_a = {$radom} % 2; // 产生-1 到1 之间随机的比特流
data_in_b = 16’b1101_1011_1110_0011; // 产生固定的比特流
$display(“a= %d\ n”, a); // 与C 语言类似
end
2. Verilog 语法中的并行与顺序模块
(1) 连续赋值语句、always 模块之间、实例模
文档评论(0)