verilog教程语法细节(深圳大学)_第1页
verilog教程语法细节(深圳大学)_第2页
verilog教程语法细节(深圳大学)_第3页
verilog教程语法细节(深圳大学)_第4页
verilog教程语法细节(深圳大学)_第5页
已阅读5页,还剩127页未读 继续免费阅读

下载本文档

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

文档简介

1、语法要点详细讲解 有关测试模块编写的语法 ; 语法的高级部分: 函数、任务、文件、存贮器建立模型、双向总线、UDP 综合指令目的:目的: 复习如何编写较复杂的测试文件,对所做的设计进复习如何编写较复杂的测试文件,对所做的设计进行完整的测试和验证。行完整的测试和验证。 掌握组织模块测试的常用方法;学会编写常用掌握组织模块测试的常用方法;学会编写常用的的测测试代码。试代码。 了解了解ROMROM和和RAMRAM 了解双向端口了解双向端口 注:虚线表示编译器能检查输入文件的可读性和是否存在以及是否允许生成输出文件include文件设计文件厂家元件库文件输入文件:激励和期望的输出信号输出文件:激励和实

2、际输出的信号编译器仿真器仿真器激励信号需要验证的设计激励信号和用于验证的结果数据需要验证的设计简单的测试平台复杂的测试平台在在测试块测试块中常用到中常用到forkjoin块块。用并行。用并行块块能表示以同一个能表示以同一个时间时间起点算起的多个事起点算起的多个事件的运行,并行地件的运行,并行地执执行复行复杂杂的的过过程程结结构,如循构,如循环环或任或任务务。 。举举例例说说明如下:明如下:module inline_tb;reg 7:0 data_bus; initial fork data_bus= 8 b00; #10 data_bus = 8 h45; /这这两个两个repeat开始开始

3、执执行行时间时间不同,但能同不同,但能同时时运行运行 #20 repeat (10) #10 data_bus = data_bus +1; #25 repeat (5) # 20 data_bus = data_bus 1; #140 data_bua = 8 h0f; joinendmodule时间时间 data_bus0 8 b0000_000010 8 b0100_010130 8 b0100_011040 8 b0100_011145 8 b1000_111050 8 b1000_111160 8 b1001_000065 8 b0010_000070 8 b0010_0001时间时

4、间 data_bus80 8b0010_001085 8b0100_010090 8b0100_0101 100 8b0010_0001105 8b0100_0110110 8b1000_1100120 8b1000_1110125 8b0001_1100140 8b0000_1111上面模块的仿真输出如下:上面模块的仿真输出如下:在一个在一个过过程程块块中,可以用两种不同的方式中,可以用两种不同的方式对对信号信号变变量或表达式量或表达式进进行行连续赋值连续赋值。 。 过过程程连续赋值连续赋值往往是不可以往往是不可以综综合的,通常用在合的,通常用在测试测试模模块块中。中。 两种方式都有各自配套

5、的命令来停止两种方式都有各自配套的命令来停止赋值过赋值过程。程。 两种不同方式均不允两种不同方式均不允许赋值语许赋值语句句间间的的时间时间控制。控制。 assign和和deassign 适用于适用于对对寄存器寄存器类类型的信号型的信号(例如:(例如:RTL级级上的上的节节点或点或测试测试模模块块中在多个地方被中在多个地方被赋值赋值的信号)的信号)进进行行赋值赋值。 。 initial begin #10 assign top.dut.fsml.state_reg = init_state;force force 和和 release release 用于寄存器类型和网络连接类型(例如:门级扫用

6、于寄存器类型和网络连接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。描寄存器的输出)的强制赋值,强制改写其它地方的赋值。 initial begin initial begin # 10 force top.dut.counter.scan_reg.q=0; # 10 force top.dut.counter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q; # 20 release top.dut.counter.scan_reg.q; end end 在以上两个例子中,在在以上两个例子中,在1010到到2

7、0 20 这个时间段内,网络或寄存器类型这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。的信号被强制赋值,而别处对该变量的赋值均无效。 forceforce的赋值优先级高于的赋值优先级高于assignassign。如果先使用如果先使用assignassign,再使用,再使用forceforce对同一信号赋值,则信号的值为对同一信号赋值,则信号的值为forceforce所赋所赋 的的值值, ,当执行当执行releaserelease后,则信号的值为后,则信号的值为assignassign所赋所赋 的的值。值。如果用如果用forceforce对同一个信号赋了几次值,再执

8、行对同一个信号赋了几次值,再执行releaserelease,则所有赋,则所有赋的值均不再存在。的值均不再存在。可以对信号的某(确定)位、某些(确定)位或拼接的信号,使用可以对信号的某(确定)位、某些(确定)位或拼接的信号,使用forceforce和和releaserelease赋值;但不能对信号的可变位使用赋值;但不能对信号的可变位使用forceforce和和release release 来赋值。来赋值。不能对寄存器类型的信号某位或某些位使用不能对寄存器类型的信号某位或某些位使用 assign assign 和和deassign deassign 来赋值。来赋值。 虽虽然有然有时时在在设计

9、设计中会包含中会包含时钟时钟,但,但时钟时钟通常用在通常用在测试测试模模块块中。下面三个例子分中。下面三个例子分别说别说明如何在明如何在门级门级和行和行为级为级建立不同波形的建立不同波形的时钟时钟模型。模型。 例例1 1 简单简单的的对对称方波称方波时钟时钟: :注:在有些仿真器中,如果设计所用的时钟是由与其相同抽象级别的时钟模型产生的,则仿真器的性能就能得到提高。 例例22简单简单的的带带延延迟迟的的对对称方波称方波时钟时钟: :注:这两个时钟模型有些不同,行为描述的模型延迟期间一直是低电平,而门级描述的模型开始延迟有半个周期是不确定的。 例例3. 3. 带带延延迟迟、 、头头一个脉冲不一个

10、脉冲不规则规则的、占空比不的、占空比不为为1 1的的时钟时钟: :注:这两个时钟模型也有些不同,行为描述的模型一开始就有确定的电平,而门级描述的模型有延迟, 开始时电平是不确定的。举举例例说说明如何使用任明如何使用任务务: :module bus_ctrl_tb; reg 7:0 data; reg data_valid, data_rd; cpu ul(data_valid,data,data_rd); initial begin cpu_driver (8 b0000_0000); cpu_driver (8 b1010_1010); cpu_driver (8 b0101_0101);

11、end task cpu_driver;input 7:0 data_in; begin #30 data_valid =1; wait (data_rd = =1); #20 data = data_in; wait (data_rd= =0); #20 data = 8 hzz; #30 data_valid = 0; end endtaskendmodule 在在测试测试模模块块中使用任中使用任务务可以提高程序代可以提高程序代码码的效率,可以用的效率,可以用任任务务把多次重复的操作包装起来。把多次重复的操作包装起来。waitwaitwaitwaitdata1 data2data3 dat

12、a4cpu_data clkdata_validdata_rdread_cpu_state目目标标学会如何用学会如何用VerilogVerilog对对存存储储器建模。器建模。学会如何用学会如何用VerilogVerilog中中对对双向(即双向(即输输入入/ /输输出)端口出)端口, , ( (inoutinout)建模。)建模。存存储储器建模必器建模必须须注意以下两个方面的注意以下两个方面的问题问题: : 声明存声明存储储器容量的大小。器容量的大小。 明确明确对对存存储储器器访问访问操作的操作的权权限。限。例如:指出可以例如:指出可以对对存存储储器做以下哪几种操作:器做以下哪几种操作: 1 1

13、)只)只读读 2 2) )读读写写 3 3)同步)同步读读写写 4 4)多次)多次读读,同,同时进时进行一次写行一次写 5 5)多次同步)多次同步读读写,同写,同时时提供一些方法保提供一些方法保证证一致性一致性timescale 1ns/10ps module myrom(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

14、(addr or read_en_) if(!read_en_) read_data=memaddr;endmodule ROM ROM的数据存储的数据存储在另外的一个独在另外的一个独立的文件中立的文件中上上页页所示的所示的ROMROM模型模型说说明:明:如何在如何在VerilogVerilog中用二中用二维维的寄存器的寄存器组组来定来定义义存存储储器。器。ROMROM中的数据保存在一个独立的文件中,如上中的数据保存在一个独立的文件中,如上页页的右的右边边的虚的虚线线方框所示。方框所示。这这是一种保存是一种保存ROMROM数据的通用的方法,它可以数据的通用的方法,它可以使数据和使数据和ROMR

15、OM模型分开。模型分开。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 个个单单元元/从存从存储储器器读读出到出到总线总线上上 assign data=read? memoryaddr:4bz;/从从总线总线写入存写入存储储器器 always (posedge write) memoryaddr=data;endmoduleRAMRAM模型比模型比ROMROM模型稍微复模

16、型稍微复杂杂: :它必它必须须具有具有读读写能力;写能力;进进行行读读写写时时通常使用相同的数据通常使用相同的数据总线总线; ;需要新技需要新技术术来来处处理双向理双向总线总线; ;当当读读信号无效信号无效时时, ,RAMRAM模型与模型与总线总线脱离,如果此脱离,如果此时时写写 信号也无效,信号也无效,总线总线无无驱动驱动源,源,则总线进则总线进入高阻状入高阻状态态, , 这这就避免了就避免了RAMRAM中的中的读读写写竞竞争。争。上上页页的的 RAM RAM 模模块块是可是可综综合的,但合的,但综综合出来是一大堆寄存器,占合出来是一大堆寄存器,占比比较较大的面大的面积积, ,经济经济上不太

17、合算。上不太合算。例:例: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

18、 declaration/output one word of memory wire wordsize:1 mem_word=memaddress;endmodule 上述的例子演示了怎上述的例子演示了怎样样通通过设过设置字置字长长和地址位数来和地址位数来编编 写写 只只读读存存储储器的行器的行为为模模块块。 。 注意注意 ! 在上例中,存在上例中,存储储字的范字的范围围从从0开始的,而不是从开始的,而不是从1开始,开始,这这是因是因为为存存储单储单元元是直接通是直接通过过地址地址线寻线寻址定位的。址定位的。 同同样样地,也可以用下面的方法来定地,也可以用下面的方法来定义义存存储储器和器和寻

19、寻址:址: reg wordsize:1 mem 1:words; /存存储储器地址器地址 从从1 开始开始 /地址一个一个地增加直到包含了每个地址地址一个一个地增加直到包含了每个地址对应对应的存的存储储器器 wire wordsize:1 mem_word = memaddress+1; 可以在初始化块中用一个循环或系统任务把初始数据存入存可以在初始化块中用一个循环或系统任务把初始数据存入存储器的每个单元。储器的每个单元。 使用循环把值赋给存储器数组。使用循环把值赋给存储器数组。 for(i=0;imemsize;i=i+i) / initialize memory memai=wordsi

20、ze1b1;调用调用$readmem系统任务。系统任务。 /从文件从文件 mem_file.txt 中中, 把初始数据存入存储器把初始数据存入存储器(mem)的的每个单元每个单元 $readmemb(“mem_file.txt”,mem); 注意:上面两项必须写 在initial 块中,加载这些初始化数据不需要时间。使用inout关键字声明端口为双向口。 inout 7:0 databus;使用双向口必需遵循下面的规则:inout口只能声明为网络连接类型, 不允许把它声明为寄存器类型。(所以仿真器能确定多个驱动源的最终值。)在设计中,每次只能从一个方向来驱动inout口。 例如:当使用总线读R

21、AM中的数据时,如果同时又向RAM模型的双向数据总线写数据,就会产生逻辑竞争,导致总线数据无法确定。所以必须为inout口设计控制逻辑,只有这样才能保证正确的操作。注意:声明一个inout口,可以用来输入或输出数据。inout口默认为网络连接类型。不允许在过程块(initial 或always块)中对网络连接类型的数据进行过程赋值;但可以在过程块外把一个寄存器数据类型通过连续赋值语句赋给它(inout口),或者把它与用户定义的源语(UDP)相连。必须为inout口设计控制逻辑,用来保证正确的操作。当把inout口作为输入口时,必须通过控制逻辑禁止输出到inout口。使用使用Verilog中的基

22、本元件(中的基本元件(bufif1) )为为双向口建模:双向口建模:b2b2b1b1en_a_ben_a_ben_b_aen_b_abus_abus_abus_bbus_b 注意注意 : : 在上在上页页的例子中,使用的例子中,使用en_a_ben_a_b和和en_b_a en_b_a 来控制元器件来控制元器件bufifl,bufifl,如果控制如果控制信号同信号同时时有效,有效,则结则结果无法确定。果无法确定。 所以必所以必须须把控制信号把控制信号 en_a_b en_a_b 和和 en_b_a en_b_a 在在时间时间上分开。上分开。当当en_a_b=1en_a_b=1时,元器件时,元器

23、件b1b1激活,激活,bus_abus_a的值传的值传到到bus_bbus_b上上当当en_b_a=1en_b_a=1时,元器件时,元器件b1b1激活,激活,bus_bbus_b的值传到的值传到bus_abus_a上上b2b2b1b1en_a_ben_a_ben_b_aen_b_abus_abus_abus_bbus_b 注意注意 :在:在assignassign语语句中,通句中,通过过en_a_ben_a_b和和en_b_aen_b_a控制控制bus_abus_a与与bus_bbus_b之之间间的数据交的数据交换换。如果控制信号同。如果控制信号同时时有效,有效,则结则结果不能果不能确定。所以

24、必确定。所以必须须把控制信号把控制信号 en_a_b en_a_b 和和 en_b_a en_b_a 在在时间时间上分上分开。开。当当en_a_b = 1en_a_b = 1时,时,bus_abus_a的值传到的值传到bus_bbus_b上上当当en_b_a = 1en_b_a = 1时,时,bus_bbus_b的值传到的值传到bus_abus_a上上存存储储器的端口建模:器的端口建模:module ram_cell(databus,rd.wr);module ram_cell(databus,rd.wr);inout databus;inout databus;input rd,wr;inp

25、ut rd,wr;reg datareg;reg datareg; assign databus = rd ? datareg: assign databus = rd ? datareg:bz;bz; always (negedge wr) always (negedge wr) datareg=databus; datareg=databus;endmoduleendmodule当当rdrd等于等于1 1时时dataregdatareg的的值被赋给值被赋给databusdatabus当当wrwr的下降沿到达时,的下降沿到达时,databusdatabus的值被写入的值被写入dataregd

26、atareg测试模块测试模块RAMRAM单元单元数据总线数据总线数据数据寄存寄存器器rdrdwrwr 注意: 上页中存储单元在wr的下降沿到达时存入数据。上页模块在 wr处于高电平时,通过数据总线写入数据,但必须保证wr的高电平维持时间长于数据的写入时间。 在rd处于高电平时,上述存储单元通过数据总线读出数据。由于此模型为单口存储模型,因此wr变低电平时,rd不能同时为高电平,否则就无法确定存储器的读出/写入的结果。目标: 学会怎样定义或调用任务和函数 学会怎样使用命名块 学会怎样禁止命名块和任务 系统资源和任务的调用 UDP的使用 通过把代码分成小的模块或者使用任务和函数,可把一项任务分成许

27、多较小的、易于管理的部分,从而提高代码的可读性、可维护性和可重用性。 任务: 一般用于编写测试模块或者行为描述的模块。其中可以包含时间控制(如:# delays, , wait);也可以包含input, output 、inout 端口定义和参数;也可以调用其他的任务或函数 函数函数:1) 一般用于一般用于计计算,或者用来代替算,或者用来代替组组合合逻辑逻辑。 。2) 不能包含任何延不能包含任何延迟迟;函数在零;函数在零时间执时间执行。行。3) 函数只有函数只有input变变量,量,虽虽然没有然没有output变变量,量,4) 但可以通但可以通过过函数名返回一个函数名返回一个值值。 。5) 可

28、以可以调调用其他的函数,但不可以用其他的函数,但不可以调调用任用任务务 注意:只能只能调调用本模用本模块块内的任内的任务务和函数。和函数。在任在任务务和函数中不能声明网和函数中不能声明网络连络连接接类类型的型的变变量。量。所有的所有的输输入和入和输输出出变变量量实际实际上都是本地寄存器上都是本地寄存器 。 。只有当任只有当任务务或函数或函数调调用并用并执执行完后,才能有返回行完后,才能有返回值值。 。 举举例例说说明明 : : 若任若任务务或函数中包含一个或函数中包含一个foreverforever循循环时环时,永,永远远无法无法执执行完,就行完,就不可能有返回不可能有返回值值。 。modul

29、e 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, 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 虽虽然函数不能包含定然函数不能包含定时时

30、控制,但是可以在控制,但是可以在包含定包含定时时控制的控制的过过程程块块中中调调用函数。在用函数。在模模块块中,使用名中,使用名为为f_or_andf_or_and的函数的函数时时,是,是把它作把它作为为名名为为f_or_and f_or_and 的寄存器的寄存器类类型型变变量来量来处处理的。理的。要点要点函数定函数定义义不能包含任何定不能包含任何定时时控制控制语语句。句。函数必函数必须须至少有一个至少有一个输输入,但入,但绝绝不能含有任何不能含有任何输输出和出和双向双向口;口;一个函数只能返回一个一个函数只能返回一个值值, ,该值该值的的变变量名与函数同名,数据量名与函数同名,数据类类型默型

31、默认认为为regreg类类型。型。传递给传递给函数的函数的变变量量顺顺序与函数序与函数输输入口声明的入口声明的顺顺序相同。序相同。函数定函数定义义必必须须包含在模包含在模块块定定义义之内。之内。函数不能函数不能调调用任用任务务,但任,但任务务可以可以调调用函数。用函数。函数使函数使VerilogVerilog有更广有更广阔阔的适用范的适用范围围。 。虽虽然函数只能返回一个然函数只能返回一个值值,但是它的返回,但是它的返回值值可以直接可以直接赋给赋给一个由多一个由多个子信号拼接构成的信号个子信号拼接构成的信号变变量,量, 使其使其实际实际等效于等效于产产生了多个生了多个输输出。出。 o1, o2

32、, o3, o4 = f_or_and(a, b, c, d, e); o1, o2, o3, o4 = f_or_and(a, b, c, d, e); 在函数定在函数定义时义时,如果在函数名前面定,如果在函数名前面定义义了位了位宽宽, ,该该函数就可以返回由多函数就可以返回由多位构成的矢量。如果定位构成的矢量。如果定义义函数的函数的语语句比句比较较多多时时,可以用,可以用 begin begin 和和end end 把它把它们组们组合起来。合起来。 在函数内,无在函数内,无论论以函数名命名的以函数名命名的变变量被量被赋赋了多少次了多少次值值,函数只有一个返,函数只有一个返回回值值。 。 下

33、例中的函数,声明了一个内部整型下例中的函数,声明了一个内部整型变变量量。 。举举例例说说明如下:明如下: module foo; input 7:0 loo; /也可以用连续赋值语句调用函数 wire 7:0 goo = zero_count (loo); function 3:0 zero_count; input 7:0 in_bus; integer I; begin zero_count = 0; for (I=0; I8; I= I+1) if (!in_busI) zero_count = zero_count +1; end endfunction endmodule 若把函数定

34、若把函数定义为义为整型、整型、实实型或型或时间类时间类型,就可以返回相型,就可以返回相应类应类型的数据。我型的数据。我们们可以可以在任何在任何类类型的表达式中型的表达式中调调用函数用函数。 。module checksub(neg,in_a,in_b); output neg; input a, b; reg neg; function integer subtr; input 7:0 in_a, in_b; subtr = in_a in_b; /运算结果可以为负数 endfunction always (a or b) begin if ( subtr (a,b) 0) neg = 1;

35、else neg = 0; end endmodule 函数函数类类型、端口和行型、端口和行为为定定义时义时也可以使用参数,也可以使用参数, 这样这样就可以构成参数化函数使就可以构成参数化函数使其返回的数据其返回的数据类类型、型、输输入端口的位入端口的位宽宽等很容易做修改。所以参数化函数就有更广等很容易做修改。所以参数化函数就有更广泛的适用范泛的适用范围围。 。 下面模下面模块块中的任中的任务务含有定含有定时时控制和一个控制和一个输输入,并且引用了一个本模入,并且引用了一个本模块块的的变变量,但是没有量,但是没有输输出,也没有双向出,也没有双向总线总线和内部和内部变变量,不量,不显显示任何内容

36、。示任何内容。用于定用于定时时控制的信号,例如控制的信号,例如 clk, ,绝对绝对不能作不能作为为任任务务的的输输入,入,这这是因是因为输为输入入值值只向任只向任务务内部内部传递传递一次。一次。 task neg_clocks; input 31:0 number_of_edges; repeat(number_of_edges) (negedge clk); endtask initial begin clk=0; a=1; b=1; neg_clocks(3); /任任务调务调用用 a=0; neg_clocks(5); b=0; end endmodule module top; re

37、g clk, a, b; DUT u1(out, a, b, clk); always #5 clk=!clk; 要点:任务调用是通过在Verilog模块中写入任务名来实现的。任务中可以包含input, output和inout端口变量的声明。 传递给任务的变量与任务I/O端口变量的声明次序相同。虽然传递给任务的变量名可以和任务内声明的I/O端口变量名相同,但是为了使任务成为一个独立的可共用的任务块,建议不要使用与任务内声明的I/O端口变量名相同的变量名,最好给传递到任务的变量起新的不同的名字。在任务中可以使用时间控制。任务使Verilog有更广阔的适用范围。关键字disable可以用来禁止任

38、务的执行。注意: 不要在程序的不同部分同时调用同一个任务。这是因为任务只有一组本地变量,同一时刻调用两次相同的任务将会导致错误。这种情况常发生在使用定时控制的任务中。 在任务或函数中,引用父模块中声明的变量时要特别注意(即注意变量的层次命名规则)。若想在其它模块中调用任务或函数,该任务和函数中所使用的变量必须全都包含在输入/输出口列表中。 下面模下面模块块中的任中的任务务只含有一个双向只含有一个双向总线总线( (inout)端口和一个内部)端口和一个内部变变量,没有其它量,没有其它输输入端口、入端口、输输出端口和定出端口和定时时控制,没有引用模控制,没有引用模块变块变量,不量,不显显示任何内容

39、。示任何内容。 在任在任务调务调用用时时,任,任务务的的输输入入变变量(端口)在任量(端口)在任务务内部被当作寄存器内部被当作寄存器类类型型变变量量处处理。理。 parameter MAX_BITS=8; reg MAX_BITS:1 D; task reverse_bits; inout 7:0 data; /双向双向总线总线端口被当作寄存器端口被当作寄存器类类型!型! integer K; for (k=0; kMAX_BITS; K=K+1) reverse_bits MAXBITS (K+1) = dataK; endtask always (posedge clk) reverse_

40、bits (D); 下面模下面模块块中定中定义义的任的任务务含有含有输输入、入、输输出、出、时间时间控制和一个内部控制和一个内部变变量,并且量,并且引用了一个本模引用了一个本模块块的的变变量,但是没有量,但是没有输输出,不出,不显显示任何内容。任示任何内容。任务调务调用用时变时变量量顺顺序序应应与任与任务务定定义义中声明的中声明的顺顺序相同。序相同。 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

41、) multme(a, b, out); /任任务调务调用用multme; /任任务务定定义义 input 3:0 xme, tome; output 可以通可以通过过在关在关键键字字begin或或fork后加上:后加上: 块块名名 来来给块给块命名。命名。 module named_blk; begin :seq_blk end fork : par_blk join endmodule可以在命名可以在命名块块中声明本地中声明本地变变量。量。可以使用可以使用disable禁止命名禁止命名块块。 。注意:注意: 命名命名块块使使VerilogVerilog有更广有更广阔阔的适用范的适用范围围。

42、 。 命名命名块块的使用的使用缩缩短了仿真的短了仿真的时间时间。 。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 out; always (posedge clk) begin : arith_block /*命名名命名名为为arith_block的的块块* reg 3:0 tmp1, tmp2; /*本地本地变变量量* tmp, tmp2 = f_or_and(a, b, c, d, e); / 函数函数

43、调调用用 if(en_mult) multme(tmp1, tmp2, out); /任任务调务调用用 end always (negedge en_mult) begin /停止停止计计算算 disable multme; /*禁止任禁止任务务的的执执行行 diable arith_block; /*禁止命名禁止命名块块的的执执行行 end /在此定在此定义义任任务务和函数和函数 .endmodle注意:注意:disabledisable语语句用来句用来终终止命名止命名块块或任或任务务的的执执行。行。这这是指在尚是指在尚未未执执行行该该命名命名块块或任或任务务任何一条任何一条语语句前,就从句

44、前,就从该该命名命名块块/ /任任务执务执行中返回。行中返回。 语语法:法: disable 块块名名 或或 disable 任任务务名名 禁止禁止执执行命名行命名块块或任或任务务后,所有在事件后,所有在事件队队列中由列中由该该命名命名块块/任任务务安排的事件都将被安排的事件都将被删删除。除。一般一般 情况下情况下disable语语句是不可句是不可综综合的。合的。在上在上页页的例子中,只禁止命名的例子中,只禁止命名块块也可以得到也可以得到预预期的期的结结果:命名果:命名块块中所有的事件,包括任中所有的事件,包括任务务和函数的和函数的执执行都将行都将被取消。目的:目的: 学学习习LPM(Libr

45、ary of Parameterrized Modules) 资资源的利用;源的利用; 学学习调试习调试用系用系统统任任务务的利用:的利用: $random; $fmonitor; $fdisplay. $fopen ; $fclose; $readmemh. 在在LPM库库中必中必须须已已经经有有该该具体参数化模具体参数化模块块,名称和使用注意点,名称和使用注意点已已经经通通过阅读说过阅读说明明书书搞清楚了,搞清楚了,举举例如下:例如下: 语语法要点:法要点:$random; $random()$random; $random(); ;举举例如下:例如下: 语语法要点法要点:$fopen(文

46、件名); file_handle=$fopen(文件名);/标准的输出显示器 descriptor=32h0000_0001(bit 0 set)integer handle1, handle2.;initial begin handle1= $fopen(file1.out); /bit 1 set handle2= $fopen(file2.out); /bit 2 set handle3= $fopen(file3.out); /bit 2 set end 语语法要点:法要点: $fdisplay (,p1,p2,.pn); $fmonitor (,p1,p2,.pn);integer

47、desc1,desc2,desc3;initial begin desc1=handle1|1; fdisplay(desc1, Display 1,); /写到文件file1.out (handle1)和显示器(1)(stdout) desc2=handle2|handle1; fdisplay(desc2, Display 2,); /写到文件file1.out (handle1)和文件file2.(handle2) desc3=handle3; fdisplay(desc3, Display 3,); /只写到文件file3.out (handle1)中 end 语语法要点:法要点: $

48、fclose ();举例:$fclose(handle1); /关闭file1.out 可以用于任何可以用于任何显显示任示任务务如:如:$display,$write,$monitor,$strobe$display,$write,$monitor,$strobe. .举举例:例: module M; . initial $display (Displaying in %m); endmodule module top; M m1( ); /显示层次信息 M m2( ); M m3( ); . endmodule 显显示任示任务结务结果如下:果如下: 语语法要点:法要点: $readmemb(

49、文件名,存储器名); $readmemb(文件名, 存储器名,起始地址); $readmemh(文件名, 存储器名,起始地址);举例: module test; reg 7:0 memory 0:1023 integer i; inititial begin $readmemb (init.dat,memory); for (i=0;i1024;i=i+1;) $display (memory %0d=%b, i, memory); end endmodule init.dat 文件内容:0021111_1111 0101_01010000_0000 1010_1010008Zzzz_1111

50、 0000_11111111_0000 0001_1000. 目目标标学会怎学会怎样样使用用使用用户户定定义义的原的原语语来来创创建建逻辑逻辑。 。用用户户定定义义的原的原语语元件元件 (UDP) 其行其行为为与与 Verilog 语语法中本来就存在的法中本来就存在的primitive(原原语语元件)相似,它用一个表格来定元件)相似,它用一个表格来定义义它的它的逻辑逻辑功能。功能。 输入端口的个数输入端口的个数所需内存的字节数所需内存的字节数1-5165717856918710623primitive multiplexer(o, a, b, s);primitive multiplexer(

51、o, a, b, s); output o; output o; input s, a, b; input s, a, b; table table / a b s : o / a b s : o 0 ? 1 : 0; 0 ? 1 : 0; 1 ? 1 : 1; 1 ? 1 : 1; ? 0 0 : 0; ? 0 0 : 0; ? 1 0 : 1; ? 1 0 : 1; 0 0 x : 0; 0 0 x : 0; 1 1 x : 1; 1 1 x : 1; endtable endtableendprimitiveendprimitive原语名原语名输出端口必须为输出端口必须为第一个端口第一个

52、端口注:注:在模在模块块外定外定义义 UDP 。 。如果在表中没有如果在表中没有规规定定输输入入组组合,将合,将输输出不确定出不确定逻辑值逻辑值 (x)。 。表的列中元素的表的列中元素的顺顺序序应应与端口列表中的一致。与端口列表中的一致。表中的表中的 ?的意?的意义义是:重复的是:重复的输输入入 0, ,1或或 任意不确定任意不确定逻辑值逻辑值(x)。 。表中开始两行表示:当表中开始两行表示:当 s等于等于 1 时时,不管,不管 b 逻辑值逻辑值如何如何变变化,化,输输出出 o 将与将与 输输入入 a 保保持一致。持一致。 表中的下两行表示:当表中的下两行表示:当 s 等于等于 0 时时,不管

53、,不管 a逻辑值逻辑值如何如何变变化,化,输输出出 o 将与将与输输入入 b 保持保持一致。一致。 表中表中 的最后两行使此器件的描述更加的全面、准确。它的最后两行使此器件的描述更加的全面、准确。它们们表示:当表示:当输输入入 a 和和 b 的的逻辑逻辑值值相同相同时时,如果,如果 sel 逻辑值逻辑值不确定,不确定,则输则输出出 o 的的值值 将与将与输输入入 a 和和 b 的的值值相同。相同。这这种种行行为为不能使用不能使用 Verilog 语语言提供的基本原言提供的基本原语语元件元件进进行建模。行建模。UDP 将将 x 作作为实际为实际的未的未知知值值,而不是,而不是 Verilog 语

54、语言言逻辑值逻辑值来来进进行行处处理,因此使其比理,因此使其比Verilog语语言提供的基本言提供的基本原原语语元件更加准确。元件更加准确。可以只使用两个可以只使用两个 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; endtalbeendprimiti

55、ve向上一级进位下一级来的进位/全加器求和全加器求和实现实现部分部分primitive U_ADDR2_S(S, A, B,CI); output S; input A, B, CI; table / A B CI : S 0 0 0 : 0; 0 0 1 : 1; 0 1 0 : 1; 0 1 1 : 0; 1 0 0 : 1; 1 0 1 : 0; 1 1 0 : 0; 1 1 1 : 1; endtableendprimitive 若使用若使用 UDP 设计设计全加器,全加器,仅仅需要两个需要两个 UDP; ; 而使用而使用 Verilog 原原语语元件,元件,则则需要需要 5 个个Ve

56、rilog语语言提供的基本原言提供的基本原语语元件。元件。当当设计设计需要使用大量全加器需要使用大量全加器时时,采用,采用UDP来表示全加器,将大大来表示全加器,将大大减少内存的需要。减少内存的需要。事件的数目将大大降低。事件的数目将大大降低。?表示?表示逻辑值逻辑值可以可以为为 0, ,1或或 x。 。primitive latch(q, clock, data); output q; reg q; input clock, data; initial q=1 b1; table / clock data current next / state state 0 1 : ? 1; 0 0 :

57、 ? 0; 1 ? : : -; endtableendprimitive注意此寄存器的用法,此寄存注意此寄存器的用法,此寄存器用来存储。器用来存储。输出初始化为输出初始化为 1 1b1.b1. ? ? 表示无须考虑输入和当前状态的值表示无须考虑输入和当前状态的值注:注:锁锁存器的存器的动动作行作行为为如下:如下: 当当时钟时钟信号信号为为 0时时, ,输输入数据的入数据的值值直接直接传给输传给输出。出。 当当时钟时钟信号信号为为1时时, ,输输出保持当前状出保持当前状态态不不变变。 。next state 栏栏中的中的 “ “-” ” 表示表示输输出保持不出保持不变变。 。输输出必出必须须定

58、定义为义为寄存器寄存器类类型,用来保存前一个状型,用来保存前一个状态态。 。initial q=1 b1; 是是时时序序 UDP 的初始化的初始化语语句。使用此句。使用此语语句可以在仿真的开始句可以在仿真的开始对输对输出出进进行行赋值赋值。 。 在在实际实际的部件模型中,很少使用初始的部件模型中,很少使用初始赋值赋值。但在。但在测试测试 UDP 的功能的功能时时,初始,初始赋赋值值相当有用。相当有用。primitive d_edge_ff (q, clk, data);output q;input clk, data;reg q;table / clk dat state next (01)

59、0 : ? : 0; (01) 1 : ? : 1; (0 x) 1 : 1 : 1; (0 x) 0 : 0 : 0; (x1) 0 : 0 : 0; (x1) 1 : 1 : 1; / 忽略忽略时钟时钟的下降沿的下降沿 (?0) ? : ? : -; (1x) ? : ? : -; / 忽略忽略时钟稳时钟稳定定时时的数据改的数据改变变 endtableendprimitive在大多数情况下,可以在任何表入口在大多数情况下,可以在任何表入口语语句中句中规规定一个定一个输输入入过过渡。渡。如果如果规规定了任何定了任何输输入入过过渡,渡,则则必必须规须规定所有定所有输输入的所有入的所有过过渡。渡

60、。建立建立时间时间和保持和保持时间时间的概念:的概念:clockholduptimedatasetuptime/setup check is set/clock is the reference/data is being checked for violation/violation reported if Tposedge_clk -Tdata3specify $setup (data, posedge clock, 3);endspecify /Hold check is set/clock is the reference/data is being checked for viola

温馨提示

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

评论

0/150

提交评论