2022年2022年可综合的Verilog语法子集总汇

上传人:汽*** 文档编号:567371769 上传时间:2024-07-20 格式:PDF 页数:9 大小:108.50KB
返回 下载 相关 举报
2022年2022年可综合的Verilog语法子集总汇_第1页
第1页 / 共9页
2022年2022年可综合的Verilog语法子集总汇_第2页
第2页 / 共9页
2022年2022年可综合的Verilog语法子集总汇_第3页
第3页 / 共9页
2022年2022年可综合的Verilog语法子集总汇_第4页
第4页 / 共9页
2022年2022年可综合的Verilog语法子集总汇_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《2022年2022年可综合的Verilog语法子集总汇》由会员分享,可在线阅读,更多相关《2022年2022年可综合的Verilog语法子集总汇(9页珍藏版)》请在金锄头文库上搜索。

1、常用的 RTL 语法结构如下: 模块声明:moduleendmodule 端口声明: input,output,inout (inout 的用法比较特殊,需要注意) 信号类型: wire,reg,tri 等,integer 常用语 for 语句中( reg,wire 时最常用的,一般tri 和 integer不用) 参数定义: parameter 运算操作符:各种逻辑操作符、移位操作符、算术操作符大多时可综合的(注:= 与!=是不可综合的) 比较判断: if else,case(casex,casez)default endcase 连续赋值: assign, 问号表达式(?:) always

2、 模块:(敏感表可以为电平、沿信号posedge/negedge ;通常和 连用) beginend(通俗的说,它就是C 语言里的 “ ”) 任务定义: task endtask 循环语句: for(用的也比较少,但是在一些特定的设计中使用它会起到事半功倍的效果) 赋值符号: = 和 = (阻塞和非阻塞赋值,在具体设计中时很有讲究的)可综合的语法时verilog 可用语法里很小的一个子集,用最精简的语句描述最复杂的硬件,这也正是硬件描述语言的本质。对于做RTL 级设计来说,掌握好上面这些基本语法是很重要。相信大家在看了这么多了verilog 语法书籍以后一定有点烦了,那么现在我告诉大家一个好消

3、息,对于一个 RTL 级的设计来说,掌握了上面的语法就已经足够了,无论多么牛逼的工程师,在他的代码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 里无非也就是上面一些语法而已。当然了,对于一个能够进行很好的仿真验证的代码,一般还需要在RTL 级的设计代码中添加一些延时之类的语句,比如大家一定知道#10 的作用,就是延时10 个单位时间,这个语句虽然在仿真的时候是实实在在的延时,但是这个语句在综合后是会被忽略的,也就是说在我们综合

4、并且布局布线最后烧进FPGA 里,这个 #10 的延时是不会在硬件上实现的。所以说,上面给出的这些语法才是可以最后在硬件上实现的,其它的语法大多会在综合后被忽略。这么一来大家就要问了,为什么语法书里又要给出这么多的语法呢?呵呵,它们大都是为仿真验证是写testbench准备的,先点到为止,下集继续!对于模型( module )的建立,要保证可综合性应该注意:(1)不使用 initial 。(被忽略)(2)不使用 #10。(被忽略)(3)不使用循环次数不确定的循环语句,如forever 、while 等。(4)不使用用户自定义原语(UDP 元件)。(5)尽量使用同步方式设计电路。(6)除非是关键

5、路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。(7)用 always 过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。(8)所有的内部寄存器都应该能够被复位,在使用FPGA 实现设计时,应尽量使用器件的全局复位端作为系统总的复位。(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。(10)不能在一个以上的always 过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。(11)如果不打算把变量推导成锁

6、存器,那么必须在if 语句或 case 语句的所有条件分支中都对变量明确地赋值。(12)避免混合使用上升沿和下降沿触发的触发器。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。(14)避免在 case 语句的分支项中使用x 值或 z 值。但是在仿真验证程序中,一般VerilogHDL 语法都是容许的。Verilog 语法需要注意的一些

7、要点1 Testbench 中时钟和数据比特流的简单设计方法always clock = clock; always (posedge clock) begin data_in_a = $radom % 2; / 产生-1 到 1 之间随机的比特流data_in_b = 16b1101_1011_1110_0011; / 产生固定的比特流$display(“a= %dn”, a); / 与 C 语言类似end 2 Verilog 语法中的并行与顺序模块(1) 连续赋值语句、 always 模块之间、实例模块之间都是并行语句(2) always 模块内部是分情况而定,对于if else 而言,总

8、是有优先级的顺序的,对于case 而言,无优先级,是完全顺序执行的,此外,还要对阻塞语句和非阻塞语句具体分析。3 Verilog 中四种最常见的变量(1) wire ,即线网形变量,它不能存储值,必须受到驱动器或者连续赋值语句的驱动,如果没有驱动,那么它将会是高阻态(2) reg 是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用与改变触发器存储的值相当。寄存器变量的初时值为不确定态。在always 内部用到的变量必须是reg 型的。(3) prarmeter 相当与 VHDL 中的 constant 4 注意区分集中容易混淆的运算符(1) 位运算符,按位操作,|,&, ,其输出

9、与输出一样位宽(2) 逻辑运算符,输出0 或者 1,&,|,! 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - (3) 缩减运算符,按位递归运算,&,|,!,其输出仅仅是1 或者 0 5 阻塞语句( blocking )与非阻塞赋值语句(non-blocking )(1) 非连续赋值语句( non-blocking )(b = a )在 always 块结束后才完成赋值操作,并且赋值后b 不是立即就改变,在时序逻辑或者既有时序逻

10、辑也有组合逻辑中一定要用这种赋值方式(2) 阻塞语句( blocking )( b = a)赋值之后, b 就立即改变,也就是在赋值语句完成以后,always 才结束,在综合时,如果不注意,将产生意想不到的结果一个非常典型的例子:always (clock) begin b = a; c = b; end always (clock) begin c = b; b = a; end always (clock) begin b = a; c = b; end 6 使用 if 或者是 case 进行综合时,一定要覆盖所有可能的情况,防止锁存器的综合7 写 testbench 一些常见的保留字名师

11、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - $display(“print_word_value = %d”, print_word_value); / 与 C 语言类似$display(“%h, %o”, 12 b1101_0100_0111); / 结果是 0xD47 和 o6507 $monitoron; / 监控开始$mointor($time, “rxd = %b ”, “txd = %b ”, rxd, txd);

12、/ 打印当前时刻的监控值$monitoroff; $finish; / 仿真结束$readmemb(“数据文件名 ”, 存储器名 ); / 把数据读入到当前指定的存储器内rand_data = random % 60; / 产生-59 到 59 之间的随机数8 比较下面代码,分别综合出什么,可能出现什么问题module dff_en(I_en, I_data, I_clock, O_data); input I_clock; input I_en; input I_data; output O_data; reg R_data; assign O_data = R_data; always (

13、I_clock) begin if (I_en = 1) R_data = I_data; end endmodule 有以下告警(用synplify 综合)(1) Incomplete sensitivity list - assuming completeness (2) Referenced variable I_en is not in sensitivity list (3) Referenced variable I_data is not in sensitivity list (4) Latch generated from always block for signal 名师

14、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - 如果改 always (I_clock) 为 always (posedge I_clock)就可以避免,并产生一个带使能的DFF 9 下面逻辑有没有问题?module dff_en(I_reset1, I_reset2, I_data, I_clock, O_data); input I_clock; input I_reset1; input I_reset2; input I_d

15、ata; output O_data; reg R_data; assign O_data = R_data; always (negedge I_reset1 or posedge I_clock) / 敏感变量 I_reset2 在时钟begin if (I_reset1 = 0) R_data = 0; else if (I_reset2 = 0) R_data = 1; else R_data = I_data; end endmodule 综合时不会有告警, 产生一个带复位和置位的DFF,最好改 always (negedge I_reset1 or posedge I_clock)

16、 为 always (negedge I_reset1 or negedge I_reset2 or posedge I_clock) 10逻辑综合结果是什么?module mux2s1(I_sel, I_a, I_b, O_c, O_d) input I_sel, I_a, I_b; output O_c, O_d; reg R_c; reg R_d; assign O_c = R_c; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - -

17、 - - assign O_d = R_d; always (I_sel, I_a, I_b) begin case (I_sel) 1b0: R_c = I_a; / 综合出 latch 1b1: R_d = I_b; / latch endcase end endmodule 该逻辑将产生锁存器。11下面代码综合结果是什么?module dff_sys(I_clock, I_data, O_data); input I_clock, I_data; output O_data; reg R_b, R_c, R_d; always (posedge I_clock) begin R_c =

18、R_b; R_b = I_data; R_d = R_c; end endmodule module dff_sys(I_clock, I_data, O_data); input I_clock, I_data; output O_data; reg R_b, R_c, R_d; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - always (posedge I_clock) begin R_c = R_b; R_d = R_

19、c; R_b = I_data; end endmodule 两段逻辑都没有任何区别,综合电路如下,这也说明了non-block 语句的特点下面逻辑呢?module dff_sys(I_clock, I_data, O_data); input I_clock, I_data; output O_data; reg R_b, R_c, R_d; assign O_data = R_d; always (posedge I_clock) begin R_b = I_data; R_c = R_b; R_d = R_c; end endmodule module dff_sys(I_clock,

20、I_data, O_data); input I_clock, I_data; output O_data; reg R_b, R_c, R_d; assign O_data = R_d; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - always (posedge I_clock) begin R_b = I_data; R_c = R_b; R_d = R_c; end endmodule 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号