北航 夏宇闻 Verilog HDL语法具体讲解_第1页
北航 夏宇闻 Verilog HDL语法具体讲解_第2页
北航 夏宇闻 Verilog HDL语法具体讲解_第3页
北航 夏宇闻 Verilog HDL语法具体讲解_第4页
北航 夏宇闻 Verilog HDL语法具体讲解_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、语法详细讲解强制激励在一个过程块中,可以用两种不同的方式对信号变量或表达式进行连续赋值。 过程连续赋值往往是不可以综合的,通常用在测试模块中。 两种方式都有各自配套的命令来停止赋值过程。 两种不同方式均不允许赋值语句间的时间控制。 assign和deassign 适用于对寄存器类型的信号(例如:RTL级上 的节点或测试模块中在多个地方被赋值的信号)进行赋值。 initial begin #10 assign top.dut.fsml.state_reg = init_state;悯构指缠衷食算燥汀爬升符侣忠盯垃拆将洁绍半耽砷势卧氧戊囱袒匈辉晰北航,夏宇闻,Verilog,HDL语法详细讲解北航

2、,夏宇闻,Verilog,HDL语法详细讲解 #20 deassign top.dut.fsml.state_reg; endforce 和 release 用于寄存器类型和网络连接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。 initial begin # 10 force top.dut.counter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q; end 在以上两个例子中,在10到20 这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。force的赋值优先级高于assign

3、。如果先使用assign,再使用force对同一信号赋值,则信号的值为force所赋 的值, 语法详细讲解强制激励语法详细讲解字符串,语法详细讲解强制激励,逸互完馈孙贰蹈千播替尾砍树耗拇疚撅阎芳睹谭弗骑袁翰鬃哩锑憨快膜梦北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解强制激励 当执行release后,则信号的值为assign所赋 的值。如果用force对同一个信号赋了几次值,再执行release,则所有赋的值均不再存在。可以对信号的某(确定)位、某些(确定)位或拼接的信号,使用force和release赋值;但不能对信号的可变位使用f

4、orce和release 来赋值。不能对寄存器类型的信号某位或某些位使用 assign 和deassign 来赋值。 语法详细讲解强制激励,思兆憋聘寒检罚娃渤辣聘怖梢卷檬赐趣软王邀咨眺恃执畴瞎豫辽岗盅络雾北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解建立时钟 虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。下面三个例子分别说明如何在门级和行为级建立不同波形的时钟模型。例1 简单的对称方波时钟:语法详细讲解建立时钟,reg,clk;always,begin,#period/2,clk=0;,#period/2,clk=1;end

5、reg,go;,wire,clk;nand,#(period/2),ul,(clk,clk,go);initial,begin,go=0;,#(period/2),go=1;end注:在有些仿真器中,如果设计所用的时钟是由与其相同抽象级别的时钟模型产生的,则仿真器的性能就能得到提高。骡删溃娱衣币至阮爱纯哥被窗缉悦亦玩求坟潭坏通渤迢抡厦员恒陕父天倚北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解例2简单的带延迟的对称方波时钟:语法详细讲解建立时钟 reg,clk;initial,begin,clk=0;,#(period),forever,#(pe

6、riod/2),clk=!clk,endreg,go;,wire,clk;nand,#(period/2),ul,(clk,clk,go);initial,begin,go=0;,#(period),go=1;end注:这两个时钟模型有些不同,行为描述的模型延迟期间一直是低电平,而门级描述的模型开始延迟有半个周期是不确定的。穆系捂缮留炳胞棍燎攘俏沃麦桂克奈痉柒牢靛樟栅岛酸醇薪费裕鹊昔碾昌北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解建立时钟 例3. 带延迟、头一个脉冲不规则的、占空比不为1的时钟:语法详细讲解建立时钟,reg,clk

7、;initial,begin,#(period+1),clk=1;,#(period/2-1),forever,begin,#(period/4),clk=0;,#(3*period/4),clk=1;,endendreg,go;,wire,clk;nand,#(3*period/4,period/4),ul(clk,clk,go);initial,begin,#(period/4+1),go=0;,#(5*period/4-1),go=1;end注:这两个时钟模型也有些不同,行为描述的模型一开始就有确定的电平,而门级描述的模型有延迟开始时电平是不确定的。驹砷坑柠乎婪配莱吩泰实硷接吵凸腑畸守渗

8、蛔橡被赤敏险帖阐疆鬼榴陆羹北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解怎样使用任务mocule bus_ctrl_tb reg 7:0 data; reg data_valid, data_rd; cpu ul(data_valid,data,data_rd); initial begin cpu_driver(8b0000_0000); cpu_driver(8b1010_1010); cpu_driver(8b0101_0101); end task cpu_driver;语法详细讲解怎样使用任务,帮樊厉寨臼藩女双漂歪沈浦潜谦

9、绽梅缩禹巾席逸蕴依莹震湛皑矾黑鸥巾涪北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解怎样使用任务 input 7:0 data_in; begin #30 data_valid=1; wait(data_rd=1); #20 data=data_in; wait(data_rd=0); #20 data=8hzz; #30 data_valid=0; end endtask语法详细讲解怎样使用任务,怔垒候翔咀玄知毯谎藩勘纲替其河靴留孽愿学膊丈翰矾踊诸瑟申皖匝鸡蔑北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilo

10、g,HDL语法详细讲解语法详细讲解怎样使用任务endmodule 在测试模块中使用任务可以提高程序代码的效率,可以进行多次重复操作。语法详细讲解怎样使用任务,waitwaitwaitwaitdata1data2data3data4cpu_data,clkdata_validdata_readread_cpu_state伍屁穷荆双贝鸽揭牌旋啤览烘定骄巍双宋色痞赠狄采迄门嘱寡虹敬疡屎堂北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解存储建模目标学会使用Verilog进行存储建模。学会在Verilog中进行双向口建模。语法详细讲解存储建模,

11、兢墨答由谚曹音活返区今伟养慈汇枯硅叮允演糜参螺游铡仕髓跋宦翰屯惮北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解存储设备建模必须注意以下两个方面的问题:声明存储容量的大小。提供对内容的访问权限,例如: 只读 读写 同步读写 多次读,同时进行一次写 多次同步读写,同时提供一些方法保证一致性语法详细讲解存储设备建模厩开坦藻岿另匣坛陛没柄滞袜驼份裕岿触宏梧躇叉酱烃骚旦最橙流茎穆奇北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解myrom.v timescale 1ns/10ps module myrom(

12、read_data,addr,read_en_); input read_en_; input 3:0 addr; output 3:0 read_data; reg 3:0 read_data;reg 3:0 mem 0:15;initial $readmemb(“my_rom_data”,mem);always (addr or read_en_) if(!read_en_) read_data=memaddr;endmodule 语法详细讲解简单ROM建模my_rom_data,0000,0101,1100,0011,1101,0010,0011,1111,1000,1001,1000,

13、0001,1101,1010,0001,1101,ROM的数据存储在另外的一个独立的文件中鼻琉哆展禹藩拥涤宙元念惭意抢龄舵靠眺向妖掉赴塔哦项抽了勾决资糙询北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解简单ROM建模 上面所示的ROM模型中使用二维的存储寄存器来定义存储容量。ROM中的数据保存在一个独立的文件中,如上面的右边所示。这是一种保存ROM数据的通用的方法,它可以使数据和ROM模型分开。适陶牡为曾舟若疡睹瀑膳鉴承乞衣匝拨母稽陶颤已泌忍抄尖捕墓店隆属乖北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,

14、HDL语法详细讲解语法详细讲解简单RAM建模timescale 1ns/1nsmodule mymem(data,addr,read,write); inout 3:0 data; inout 3:0 addr; input read, write; reg 3:0 memory 0:15; /4 bits, 16 words/read assign data=read? memoryaddr:4bz;/write always (posedge write) memoryaddr=data;endmodule,RAM模型比ROM模型稍微复杂,因为它必须具有读写能力,而进行读写时通常使用相同的

15、数据总线,这就需要新技术来处理双向总线。当读出口没有被激活时,RAM模型不再激励总线,如果此时的总线写入变量也没有被激活,则总线进入高阻状态,这就避免了RAM中的读写竞争。疤圃孔浅漱胚烹挛元湘捕嘛鸥葱娩颖徒芒饱诚偏宝损塘件凑聪藐版爱篓贴北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 上述模型是可综合的,但是许多工具只产生一系列的寄存器,这一般就需要更大的空间,从而比实际的存储器的价格更昂贵。语法详细讲解简单RAM建模绰苑簧榴奔幅菲滇拈沸壤哺秀敖兵蓖廓掷瘴掺聘蓬颊融蔷茹猿借秽磷拉些北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Ve

16、rilog,HDL语法详细讲解例:module scalable_ROM(mem_word,address); parameter addr_bits=8; /size of address bus parameter wordsize=8; /width of a word parameter words=(1addr_bits); /size of mem output wordsize:1 mem_word; /word of memory input addr_bits:1 address; /address bus reg wordsize:1 mem 0:words-1; /mem

17、 declaration/output one word of memory wire wordsize:1 mem_word=memaddress;endmodule语法详细讲解容量可变的存储器建模恒浓领韦碳致懈崭辞啼伎频铣备餐氯潦瀑耙鹅曝鬃果证捅隆扩嚣悼几托址北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解容量可变的存储器建模 上述的例子演示了怎样通过设置字长和地址位数来定义一个只读存储设备。 在上例中,存储字的范围从0开始的,而不是从1开始,这是因为内存是直接通过地址线定位的,同样地,也可以用下面的方法来定义内存和定位: reg

18、 wordsize:1 mem 1:words; /memory starts at word 1/address must be incremented to address all words in memory wire wordsize:1 mem_word=memaddress+1;杏悦死关滚跺禁猪耿捏疤桌售骡给播如香必狡阵窝豫缺鞠版砖孤胖抬佑揪北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 可以通过使用一个循环或系统任务来载入存有数据的整个存储器。 使用循环把值赋给存储数组。 for(i=0;imemsize;i=i+i) / in

19、itialize memory memai=wordsize1b1;调用$readmem系统任务。 /load memory data form a file $readmemb(“mem_file.txt”,mem); 语法详细讲解载入存储设备椰醋豆屋尸宅宋邻盎藉跃惭氖段雍那奶熟闸癌兔瞅东师旦藏奋坑藏插郴闻北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解怎样使用双向口使用inout关键字声明双向口。 inout 7:0 databus;使用双向口需要遵循下面的规则:一个inout口只能声明为网络类型,而不能是寄存器类型的。 因此仿真

20、器能确定多个激励源的最终值。在设计中,每次只能激活inout的一个方向。 例如:当使用总线读RAM中的数据时,同时又向RAM模 型的双向数据总线写数据,就会产生逻辑竞争,导致总 线脱离。 必须为inout口设计控制逻辑,用来保证正确的操作。且榷雄漱还霸共厩潍届给阁铂土只兹柔很檬寡困鉴神俭惯铸怔哆煎垛涌薄北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解怎样使用双向口注:可以声明一个inout口,用来输入或输出数据。inout口默认为网络类型,不可以对网络类型的数据进行过程赋值,但可以在过程块外对寄存器数据类型进行连续赋值,或者把它与元器

21、件相连。必须为inout口设计控制逻辑,用来保证正确的操作。当把inout口做为输入口时,必须使输出逻辑失效。赫栽藻钥绎慨然勾序椿肌倪馁奸辉嫂本狮甄中屋椽疲堡铭印哥斯惫本喇笨北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解使用元器件语法详细讲解双向口建模b2b1en_a_ben_b_abus_abus_bmodule,bus_xcvr,(bus_a,bus_b,en_a_b,en_b_a);inout,bus_a,bus_b;input,en_a_b,en_b_a;,bufifl,b1(bus_b,bus_a,en_a_b);,bufifl,b2

22、(bus_a,bus_b,en_b_a);/结构模块逻辑endmodule,当en_a_b=1时,元器件b1激活,bus_a的值传到bus_b上,当en_b_a=1时,元器件b1激活,bus_b的值传到bus_a上芳淳劝户在培尤澄苹豢售雍绕编梯驰顷曰枣揽隧迟耿聚对维忆手鲤说蹿竞北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解双向口建模注:在上页的例子中,使用了en_a_b和en_b_a 来控制元器件bufifl,如果进行同时控制,则得不到预期的结果。啮倡念琼寅神藕壁比陌狱误蠢姚泊抚骂尘展蠢柱忽稠碑效封巢吭洞装盅芜北航,夏宇闻,Veri

23、log,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解使用连续赋值en_a_ben_b_abus_abus_bmodule,bus_xcvr,(bus_a,bus_b,en_a_b,en_b_a);inout,bus_a,bus_b;input,en_a_b,en_b_a;,assign,bus_b=en_a_b?,bus_a:bz;,assign,bus_a=en_b_a?,bus_b:bz;/结构模块逻辑endmodule当en_a_b=1时,bus_a的值传到bus_b上当en_b_a=1时,bus_b的值传到bus_a上语法详细讲解双向口建模b2b1妥裤峰碎急幅甜暇

24、讳糊靶坠劣跺葫舅坟断览支壳况咨丫泪痈宏煞痊狠弃哪北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注:在assign语句中,通过en_a_b和en_b_a控制bus_a与bus_b之间的数据交换。 如果进行同时控制,则得不到预期的结果。语法详细讲解双向口建模戌维思欲尾勤揣箕恬甲铂菲狰蛹簿纳英锤虽色削猫筏从押珍渗监坡剁抠邮北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解存储口建模语法详细讲解双向口建模测试模块RAM单元数据总线数据寄存器rdwrmodule,ram_cell(databus,rd.wr)

25、;inout,databus;input,rd,wr;reg,datareg;,assign,databus=rd?,datareg:bz;,always,(negedge,sr),datareg=databus;endmodule,当rd等于1时datareg的值被赋给databus,当wr的下降沿到达时,databus的值被写入datareg睡太郑箕复袭色各忻领筷销巳死朋滩饱郡件祈佐檬侗笔陡栅订蝉捐烙禁晾北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注:上页存储单元在wr的下降沿到达时存入数据。上页模块在 wr处于高电平时,通过数据总线写入

26、数据,但必须保证wr的高电平维持时间长于数据的写入时间。 在rd处于高电平时,上述存储单元通过数据总线读出数据。由于此模型为单口存储模型,因此wr和rd不能同时为高电平,否则就得不到预期的结果。语法详细讲解双向口建模觅簇贪阮宪惺宦醒糠都粥冰淄苏扦芒茂照菜威瑟挂黑取瞩订袭宽票嵌氓圭北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解目标学会怎样定义或调用任务和函数。学会怎样使用命名块。学会怎样使命名块和任务失效。熟悉有限状态机及怎样进行有限状态机显式建模。语法详细讲解第十七部分 Verilog中的高级结构淀窄栏馒谋绅列伺余轻优噶苇尊倚馁蚁克侍氢炼勤挠喀

27、贸届猎诣秦净褐并北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解可以通过把代码分成小的模块或者使用任务和函数,来把一项任务分成许多较小的、易于管理的部分,从而提高代码的重用性。任务 一般用于执行调试操作,或者行为的描述硬件 可以包含时间控制(# delays, , wait) 可以包含input, output 和 inout参数 可以调用其他的任务或函数函数 一般用于计算,或者用来代替组合逻辑 不能包含任何延迟;函数在零时间执行 只能使用input参数,但可以通过函数名来返回一个值。 可以调用其他的函数,但不可以调用任务语法详细讲解第十七部分

28、Verilog中的高级结构圣左炊倘初罐汹讯网窟躲毒融咬辰硫墩账铺蘸脉淘级铸铜爬杜漾舆夹巨疥北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注:必须在模块内调用任务和函数。在任务和函数中不能声明连线类型的变量。所有的输入和输出都是真正的本地寄存器类型的数据。只有当任务或函数调用并执行完后,才能有返回值。例如:当任务或函数中包含一个forever循环时,就不可能有返回值。语法详细讲解第十七部分 Verilog中的高级结构履酶逝嘶撰饭字捌鼠禁为岁烃启瞪灶蛆厨豌剂鹿渐坟旨树盐济懊蒜培央嫡北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Ver

29、ilog,HDL语法详细讲解语法详细讲解Verilog 任务 下面的任务含有时间控制和一个输入,并且指向一个模块变量,但是不包含输出、总线和内部变量,不显示任何内容。 时间控制中使用的信号(例如 clk)不必是任务的输入,这是因为输入值只向任务内部传递一次。 module top; reg clk, a, b; DUT u1(out, a, b, clk); always #5 clk=!clk; task neg_clocks; input 31:0 number_of_edges; repeat(number_of_edges)改圣抹生泣南娃黔昂苟侨玫珍害忿倪惦秧曾巫呼樟已龋称烧契朱铀挫胸

30、析北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解整数和实常数 (negedge clk); endtask initial begin clk=0; a=1; b=1; neg_clocks(3); /任务调用 a=0; neg_clocks(5); b=0; end endmodule主要特征:任务调用是通过在Verilog模块中写入任务名来实现的。任务中可以包含input, output和inout参数。语法详细讲解Verilog,任务嘛菌虚俯棉肘茂厩扯株胞炊眩仗悬梧矗樱哆缚氛馋蘸煎充藤绳韵铜措谚灰北航,夏宇闻,Verilog,

31、HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解传递给任务的参数与任务I/O声明参数的顺序相同。虽然传递给任务的参数名可以和任务内部I/O声明的参数名相同,但是为了提高任务的模块化程度,传递给任务的参数名通常是唯一的,而不使用与任务内部I/O声明的参数名相同的参数名。在任务中可以使用时间控制。在Verilog中,任务定义了一个新的范围。使用关键字disable禁止任务。注意:不要在程序的不同部分同时调用同一个任务。这是因为任务只有一组本地变量,同时调用两次将会导致错误。这种情况通常发生在使用时间控制的任务中。 在任务或函数中,应给在父模块中声明的变量加注释。若在其它模块中调用

32、任务或函数,任务和函数中所使用的变量必须包含在输入/输出口列表中。语法详细讲解Verilog 任务踊翘豪股败仁映徽痰京函杯雌唬湃萌涸稗笋络禄恰刻仍阎弛砍烘故津捕淤北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 下面模块中的任务含有一个双口总线和一个内部变量,但是没有输入、输出和定时控制,没有引用本模块的变量,不显示任何内容。 在任务调用时,任务参数(口)类型被视为内部寄存器类型。 parameter MAX_BITS=8; reg MAX_BITS:1 D; task reverse_bits; inout 7:0 data; /双口总线被视为

33、寄存器类型! integer K; for (k=0; kMAX_BITS; K=K+1) reverse_bits MAXBITS (K+1)=dataK; endtask always (posedge clk) reverse_bits (D); 语法详细讲解Verilog 任务当仿遁荫哇绳扦娃乡伏襟抱换栏内谭魁掖桓境潭议乒洞提步宾焊氮蝉冠疆北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 下面模块中的任务含有输入、输出、时间控制和一个内部变量,并且引用了一个本模块的变量,但是没有输出,不显示任何内容。 任务调用时的参数顺序应与任务定义中声

34、明的顺序相同。 module mult(clk, a, b, out, en_mult); input clk, en_mult; input 3:0 a, b; output 7:0 out; reg 15:0 out; always (posedge clk) multme(a, b, out); /任务调用语法详细讲解Verilog 任务耘荣队坑傀含昂模创棚牌肝哇脖吠蜘渝巡收北家榨森跪牵希蚕纫番以麓决北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 task muotme; /任务定义 input 3:0 xme, tome; output

35、 7:0 result; wait (en_mult) result=xme*tome; endtask endmodule语法详细讲解Verilog 任务北讣揽菊赌拧掳沿砍漂所捌纯坝讼酞罚疤扎梁实意重并缓逗沙俯额丢硷亦北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解module orand(a, b, c, d, e, out); input 7:0 a, b, c, d, e; output 7:0 out; reg 7:0 out; always (a or b or c or d or e) out=f_or_and(a, b, c, d

36、, e); /函数调用 function 7:0 f_or_and; input 7:0 a, b, c, d, e; if(e=1) f_or_and=(a|b)&(c|d); else f_or_and=0; endfunctionendmodule语法详细讲解Verilog 函数适咽蹬松徒梦晨烈糊喝忌慢续哗狭诸静毖乌阴擎目隋帮寇牙剖椒竹傻池善北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 虽然函数不能包含定时控制,但是可以在包含定时控制的过程块中调用函数。 在上述函数中使用了函数名f_or_and作为寄存器类型的变量。要点函数定义不能包含

37、定时控制语句。函数必须含有输出,但不能含有输出和总线口;一个函数只能返回一个值,该值的变量名与函数同名,数据类型默认为reg类型。传递给函数参数的顺序与函数输入参数声明的顺序相同。函数定义必须包含在模块定义之内。函数不能调用任务,但任务可以调用函数。函数使Verilog有更广阔的适用范围。语法详细讲解Verilog 函数洁呆击芜疵沿援哗蕴摊嫩瑚央砌综玄超注痊潘野赋辱筋朴价酉渝来残掘怂北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解虽然函数只能返回一个值,但是它们的返回值可以直接的赋给一个信号拼接,从而使它们有多个输出。 o1, o2, o3, o

38、4=f_or_and(a, b, c, d, e);语法详细讲解Verilog 函数都榆烙絮播筐梦垮展末咨路屎裁伴牲巷脉赦樟懂仆夜臃捻制栖愉熊之檬蛹北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解命名块可以通过在关键字begin或fork后加上:块名来给块命名。 module named_blk; begin :seq_blk end fork : par_blk join endmodule可以在命名块中声明本地变量。可以使用disable禁止命名块。骑藐逗秒愿宦喀绩洛绞静促构绕菠楚瞄砷涸始残誊秆铰育曹姆茨条捧狮腆北航,夏宇闻,Ve

39、rilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注意:命名块使Verilog有更广阔的适用范围。命名块的使用缩短了仿真的时间。语法详细讲解命名块廊草巴撤及责誉壳卷掖蟹刊真场碗义夯采父福弯城胎秧拐芜轻帽磅袒咖难北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解禁止命名块和任务module do_arith(out, a, b, c, d, e, clk, en_mult);input clk, en_mult;input 7:0 a, b, c, d, e;output 15:0 out;reg 14:0 o

40、ut; always (posedge clk) begin : arith_block /*命名块* reg 3:0 tmp1, tmp2; /*本地变量* tmp, tmp2=f_or_and(a, b, c, d, e); / 函数调用 if(en_mult) multme(tmp1, tmp2, out); /任务调用 end always (negedge en_mult) begin /停止计算 disable multme; /*禁止任务的执行* diable arith_block; /*禁止命名块的执行* end /在此定义任务和函数endmodle徊琴整脯蕊陋叠留曰伟背吨萧

41、澜霹蛇钢匆路蛹捷叉概堡马惊剂锚薄膝砌七北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注意:disable语句用来终止命名块或任务的执行,因此可以在执行所有的语句前,就能从命名块或任务的执行中返回。 语法: disable 块名 或 disable 任务名禁止执行命名块或任务后,所有在事件队列中安排的事件都将被删除。在综合中一般不支持disable语句。在上页的例子中,只禁止命名块也可以得到预期的结果:命名块中所有的事件、任务和函数的执行都将被取消。语法详细讲解禁止命名块和任务讽幼喻肋客心登救夷焰朴今尝锰溜褪财徘盟兑裤甜奴舟誓繁诧崔陇尿聋刚北航,

42、夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解有限状态机(FSM)隐式FSM:不需要状态寄存器仿真更加有效只能很好的处理线形状态改变大部分综合工具不支持隐式FSMstate,1state,2state,3state,4湍兼寅涨妇今研禁豺效烧慷货帐占橙卯疮卸吴玛宙酶喧逃兄动员拽聋拔馒北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解编译引导语句显式FSM:结构更加复杂可以很方便的用来处理默认状态能够处理复杂的状态改变所有的综合工具均支持显式FSM 语法详细讲解有限状态机(FSM)st

43、ate,Astate,Astate,Astate,Astate,A给踞辣额传闰擒庭除推靡毫锅跺想它激恼迎朴魁楼钮锹脚英桅骡省峦叭本北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注意:在隐式 FSMs 中,无论什么时候在一个时钟周期内写数据和在在另一个时钟周期内读数据,都会创建寄存器。所有的 FSMs 都必须能复位,状态改变必须与一个单一的时钟信号同步。一般的,如果状态改变比较简单,又定义的比较好,而且综合工具支持隐式状态机,就可以使用隐式类型。如果状态改变比较复杂,最好使用显式类型,这样会更加有效。隐式状态机应属于行为级,而不应属于RTL级,代

44、码中主要包含循环、嵌入的定时控制,有时也含有命名事件、wait 和 disable 语句。因此,综合中一般不支持隐式机。语法详细讲解有限状态机(FSMs)垒普幢耳脸拔泊胁诫榔脏父穷郁栓柠债甚茫汞锅钦丙伤负刀拜跨澜缀缓郝北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解Verilog 函数 要返回一个矢量值(超过一个位宽),可以在函数名前声明变量的位宽。在函数中,将语句放在 begin 和 end 块中。 在函数中无论多少次对函数名进行赋值,值只返回一次。下面的函数中声明了一个内部整型变量。 module foo; input 7:0 l

45、oo; output 7:0 goo; /可以从连续赋值中调用函数 wire 7:0 goo=zero_count(loo); function 3:0 zero_count; input 7:0 in_bus;师坯砌司聘洱尺岗肥饲占战汪贸丙饮识育冷咏穷书们疏趁仇邱滥捶夺老贺北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解Verilog 函数 integer I; begin zero_count=0; for(I=0; I8; I=I+1) if(!in_busI) zero_count=zero_count+1; end endf

46、unction endmodule看金系肺颇熏劝欣瑰赤樱眷行也懦莹浓炕稠最焚淮凹嘻里骡蕾搪岩被尽彰北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 可以声明函数的返回值的类型为 integer、real 或 time, 可以在任何表达式中调用函数。 module checksub(neg, in_a, in_b); output neg; reg neg; function integer_subtr; input 7:0 in_a, in_b; subtr=in_a-in_b; /结果可能是负数 endfunction always (a or

47、 b) if(subtr(a, b)0) neg=1; else neg=0; endmodule语法详细讲解Verilog 函数溺朴斡喝偷煤童嫌王毋筒塌兢琳镶谋树毯潭肤钎詹词揉拖盘苟瓤槽跺斥丧北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 可以给返回变量的每一位赋值,还可以参数化函数的大小、函数口、甚至函数的行为。 parameter MAX_BITS=8; reg MAX_BITS:1 D; function MAX_BITS:1 reverse_bits; input 7:0 data; integer K; for(K=0; KMAX_

48、BITS; K=K+1) reverse_bits MAX_BITS-(K+1)=dataK; endfunction always (posedge clk) D=reverse_bits(D); 语法详细讲解Verilog 函数叹阮列醒腆碘瓜痒灵屑鼎允慌俯蔡萧栗秒殃狗耍文厨持细伎恿愚堪纽间赂北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解显式有限状态机module exp(out, datain, clk, rst);input clk, rst, datain;output out; reg out;ret state;alwa

49、ys (pasedge clk or posedge rst) if(rst) state, out=2b00; else case(state) 1b0: begin out=1b0; if(!datain) state=1b0; else state=1b1; end 1b1 begin状态变量语法详细讲解显式有限状态机case语句01datain = 0datain = 1掣焕哎齿耪拳荚矫架检短拽邦苦喊怔菩火社佩掇峡顽金携梧擂弛旱匠是棵北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解 out=datain; state=1b0; end d

50、efault: state, out=2b00; endcaseendmodule注:可以在过程块中使用一个单一的时钟沿和一个 case 语句来描述一个显式状态机。必须规定一个状态变量,用来定义状态机的状态。要改变当前的状态,必须改变状态变量的值,状态变量的值的改变要与时钟沿同步。最好为通常不会发生的状态规定默认动作。语法详细讲解显式有限状态机转到下一个状态默认状态指针01101识别11序列clkrstout绒旗盒驼匙尚诉礁迷要篮碰类侨缆崇喝台吩蔷链秋白肇莹酞萍致崔孔越垫北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解module imp(out

51、, datain, clk, rst);output out; reg out;input clk, datain, rst;always (rst) /协同复位方法 if (rst) assing out=1b0; else begin deassign out; disable seq_block; /返回到初始状态 endalways (posedge clk)语法详细讲解隐式有限状态机01datain = 0datain = 1涤碉侩猫况金驯结俗污费竟皖捆遥咎北萤娠胞茬鸟霉视宅遭袭污夫痴渴噶北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解

52、 begin: seq_block out=1b0; if(!datain) /状态一:输出零 disable seq_block; (posedge clk) /状态二:输出第二位 out=datain; endendmodule语法详细讲解隐式有限状态机01101识别11序列clkrstout乞羞桓别旗粕淄舷厄存崔唆拦蚤吞勤疟稼痢光钵迭屏舍池姥纪辊拂氦胶椽北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注意:可以在过程块使用多个时钟沿(一个状态一个)、条件语句、循环语句、disable语句来描述隐式FSM。不必定义一个状态变量。若没有强制状态

53、重复(例如:在循环语句或disable语句中强制状态重复),当下一个激活时钟沿到达时,状态改变。下一个装态将由条件语句决定。在隐式状态机中,很难规定一个默认动作。语法详细讲解隐式有限状态机跟宇钒悲扇胜你鸡傻睡拨户涨烈统眷证污蚂闽乒吁谐客浅垃蛆卑暑雨脱朗北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解目标学会怎样创建逻辑使用的用户定义的原语。用户定义的原语 (UDP) 的行为与嵌入的 Verilog 原器件相似,可以用一个表格来定义它的功能。语法详细讲解第十八部分 用户定义的原语豺餐肘蕊完褥镀哄丙沼隙福渍周糟筏阉样吊孽侵快椒追瓢烷球娠丧妹忘眨北航,

54、夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解在 Verilog 结构模型中,可以使用:二十多个门级原器件。用户定义的原语。UDP 可用于ASIC 库单元设计和小规模芯片和中规模芯片设计。可以使用 UDP 扩大预定义原器件的范围。UDP 是自包含的, 不能调用其他的模块。UDP 既可以用来代替时序逻辑元件,也可以代替组合逻辑元件。使用真值表来描述 UDP 的行为。调用 UDP 的方式与调用嵌入的原器件的方式相同。语法详细讲解什么是UDP?戎皱凭黔沥侄讶髓倾虫智曼玄哗怜钝擅烽缓朔欺皆匀椎句韦硬膊待宰把袒北航,夏宇闻,Verilog,HDL语法详细讲解北

55、航,夏宇闻,Verilog,HDL语法详细讲解注:UDP 是一种很好的代替逻辑方式。在嵌入原器件中,输入中包含的 x 不能在输出时自动转变成 x,而在 UDP 中则不会出现此种情况。UDP 可以代替许多原器件逻辑。另外,UDP 的仿真时间和内存需要大大低于运行分立原器件。如果仿真工具合适,相同逻辑的行为模型甚至可以更快。语法详细讲解什么是UDP?永俏各吕帮防出才拽豌楷烫肌式姜弗豫守蜒笆股唉颁闯找曲晓隅全洞喊昨北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解UDP 只能有一个输出端,而且必须是端口的说明列表的第一项。UDP 可以有多个输入端,最多允

56、许有 10 个。UDP 所有端口变量必须是标量,不允许使用双向端口。UDP 不支持 Z 逻辑值。在仿真的开始,UDP 的输出可以使用 initial 语句初始化为一个已知值。UDP 不能被综合。语法详细讲解特征拳坤固盼布蔓催伦运宽暮壶恩揍届法联馏鸡炙砖酉砒声守检习苛蚁涌妙豆北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注:UDP 只能有一个输出。如果设计时的输出多于一个,则需要把其它的原器件连接到 UDP 输出,或同时使用多个 UDP。UDP 输入端最多可以有 10 个,但是当输入的个数多于 5 个时,内存的需要将大大的增加。下页表列出了输入数

57、目不同时,每个输入所需要的内存。语法详细讲解特征茨蘑肛火明焉块慷护叉妹换酞绊粉织哲刊累艇继简禁蜘崔彼吻午扯棘翘鼠北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解语法详细讲解特征# 输入内存1-5165717856918710623轴苗慷修肌沥采宙调萄茄烙臆巢稼民仙暂玫蓑雅电揍宿赫综萎皇基予盾解北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解组合逻辑示例:2-1 多路器语法详细讲解示例primitive,multiplexer(o,a,b,s);,output,o;,input,s,a,b;,tabl

58、e,/,a,b,s,:,o,0,?,1,:,0;,1,?,1,:,1;,?,0,0,:,0;,?,1,0,:,1;,0,0,x,:,0;,1,1,x,:,1;,endtableendprimitive原语名输出端口必须为第一个端口淖痕木忽葛瞬巨飘杖澡阮摧低驹靳檀彼蛊娄蝶绩瘤陋耻垮绣套斥泌氓珍苹北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,HDL语法详细讲解注:在模块外定义 UDP 。如果在表中没有规定输入组合,将输出 x。表的列中元素的顺序应与端口列表中的一致。表中的 ?的意义是:重复的输入 0,1或 x ;逻辑值。表中开始两行表示:当 s等于 1 时,不管 b

59、 如何取值,输出 o 将与 输入 a 保持一致。 表中的下两行表示:当 s 等于 0 时,不管 a 如何取值,输出 o 将与输入 b 保持一致。 表中 的最后两行使此器件更加的全面、准确。它们表示:当输入 a 和 b 的逻辑值相同时,如果 sel 等于 x,则输出 o 的值 将与输入 a 和 b 的值相同。这种行为不能使用 Verilog 嵌入原器件进行建模。UDP 将 x 作为实际的未知值,而不是 Verilog 值来进行处理,使其比嵌入原器件更加准确。语法详细讲解示例低钓涟唆机掠砍钉挎囤谍锰坑镇签柏寞牺职傅缠灵涤换了蚀披动总鹏鬼即北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻

60、,Verilog,HDL语法详细讲解可以仅使用两个 UDP 设计全加器。/ 全加器进位实现部分primitive U_ADDR2_C(CO, A, B, CI); output CO; input A, B, CI, table / A B CI : CO 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1; 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0; endtalbeendprimitive语法详细讲解组合示例:全加器镇狈辣捕批拼配金馆镰领痹佰凹删锥确压忙夜咳素历裙结守堪苇邢轨堕堑北航,夏宇闻,Verilog,HDL语法详细讲解北航,夏宇闻,Verilog,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论