《EDAVerilog语言PPT课件》由会员分享,可在线阅读,更多相关《EDAVerilog语言PPT课件(81页珍藏版)》请在金锄头文库上搜索。
1、sl 1) Net(网网络连线络连线): :由由模块或门驱动的连线。模块或门驱动的连线。驱动端信号的改变会驱动端信号的改变会立刻立刻传递传递到输出的连线上。到输出的连线上。例如:右图上,例如:右图上,selbselb的改的改变,会自动地立刻影响或变,会自动地立刻影响或门的输出。门的输出。 netsabselbselanslout如果不明确地说明连接是何如果不明确地说明连接是何种类型,应该是指种类型,应该是指 wire 类类型。型。Verilog语言语言 2) 寄存寄存器器(reg)类型类型 数据数据储存储存单元单元的的抽象抽象。默认默认初始初始值值为为X X常常用用行行为为语语句句结结构构来来
2、给给寄寄存存器器类类型型的的变变量量赋赋值值。用用来来表表示示alwaysalways块内的指定信号块内的指定信号abslselbnsloutreg_areg_selreg_b常为寄存器或常为寄存器或触发器的输出触发器的输出Verilog语言语言(在在alwaysalways块内被赋值的每个信号块内被赋值的每个信号都必须定义成都必须定义成regreg型型)sela 格式格式: regn-1:0 数据名数据名1,数据名,数据名2,数据名,数据名i;或或 regn:1 数据名数据名1,数据名,数据名2,数据名,数据名i;例:例: reg rega; reg3:0 regb,regc; 可以赋正值也
3、可以赋负值,但当一个可以赋正值也可以赋负值,但当一个reg型数据是一个表达式型数据是一个表达式中的操作数时,它的值被当作无符号值,即正值。中的操作数时,它的值被当作无符号值,即正值。如如regb被赋值为被赋值为-1,在表达式中被认为是?,在表达式中被认为是? Verilog语言语言例:寄存器的声明和使用例:寄存器的声明和使用 reg reset; initial begin reset=1b1; #100 reset=1b0; end reg signed 63:0 m;integer i;Verilog语言语言 3) 整数、实数和整数、实数和时间时间寄存器寄存器类型类型integer(通用寄
4、存器数据类型,用于对数量进行操作)(通用寄存器数据类型,用于对数量进行操作) 例:例: integer counter;/一般用途,做为计数器一般用途,做为计数器 inital counter=-1 1;real 实常量和实寄存器数据类型使用,默认值为实常量和实寄存器数据类型使用,默认值为0 例:例:real real deltadelta; ; initial initial beginbegin deltadelta= =4e104e10; ; deltadelta= =2 2. . . .1313; ; endend integer integer i i; ; initialiniti
5、al i i= =deltadelta; ; / / /i i的的的的值为值为值为值为2 2 Verilog语言语言 time 保存仿真时间,通过系统函数保存仿真时间,通过系统函数$ $time可以得到当前的仿真时间可以得到当前的仿真时间例例:time sve_sim_time; initial save_sim_time=$time; 4) 向量向量线线网和寄存器类型的数据均可声明为向量(位宽大于网和寄存器类型的数据均可声明为向量(位宽大于1)。若没有指定位)。若没有指定位宽,则默认为标量(宽,则默认为标量(1位)。位)。例:例:wire a; wire 7:0 bus; wire 31:0
6、 busA,busB,busC; reg clock; reg 0:40 virtual_addr;/最高有效位为第最高有效位为第0位位Verilog语言语言向量域选择向量域选择对上例中向量,可以指定它的某一位或若干个相邻位对上例中向量,可以指定它的某一位或若干个相邻位busA 7bus 2:0 /不可以写成不可以写成bus0:2,高位高位应写在范写在范围说明的左明的左侧virtual_addr 0:1可变的向量域选择可变的向量域选择+:width 从起始位开始从起始位开始递增,位增,位宽为width-:width 从起始位开始从起始位开始递减,位减,位宽为widthVerilog语言语言Ve
7、rilog语言语言reg255:0 data1;reg0:255 data2;reg7:0 byte;byte=data1 31-:8;从第从第31位算起,位算起,宽度度为8位,相当于位,相当于data131:24byte=data1 24+:8;byte=data2 31-:8;从第从第31位算起,位算起,宽度度为8位,相当于位,相当于data124:31byte=data2 24+:8;/起始位可以是起始位可以是变量,但量,但宽度必度必须为常数常数for (j=0;j=31;j=j+1) byte=data1(j*8)+:8;data1 (byteNum*8)+:8=8b0; 5) 数数组
8、组Verilog中允许声明中允许声明reg,integer,time,real,realtime及其向量类型的及其向量类型的数组,对数组的维数没有限制,线网数组也可用于连接实例的端口数组,对数组的维数没有限制,线网数组也可用于连接实例的端口integer count 0:7;reg bool31:0;time chk_point 1:100;/由由100个时间检查变量组成的数组个时间检查变量组成的数组reg 4:0 port_id 0:7;/由由8个端口标识变量组成的数组,端口变量的位个端口标识变量组成的数组,端口变量的位 宽为宽为5integer matrix 4:00:255;/二维的整数
9、型数组二维的整数型数组reg 63:0 array_4d 15:07:07:0255:0;/四维四维64位寄存器型数组位寄存器型数组wire 7:0 w_array17:05:0;/声明声明8位线型变量的二维数组位线型变量的二维数组Verilog语言语言count5=0;chk_point100=0;port_id3=0;matrix 10=33559; /第第1行行第第0列的列的整数整数型型单元单元置为置为33559array_4d000015:0=0; /把四维数组中索引号为把四维数组中索引号为0000的寄存的寄存 器型单元的器型单元的015位置为位置为0port_id=0; /非法非法m
10、atrix1=0; /非法非法Verilog语言语言 6) memory类型类型通过扩展通过扩展reg型数据的地址范围生成格式:型数据的地址范围生成格式: regn-1:0 存储器名存储器名m-1:0;或者或者 regn-1:0 存储器名存储器名m:1;例:例: reg7:0 memea255:0;必须为常数必须为常数表达式表达式Parameter wordsize=16, memsize=256 ;regwordsize-1:0 memmemsize-1:0, wreitereg, readreg;Verilog语言语言注意:注意: regn-1:0 rega; reg meman-1:0;
11、 rega=0; 等于等于等于等于 mema=0; ? mema3=0;正确?正确?正确?正确? Verilog语言语言 7) 参数参数使用关键字使用关键字parameter在模块内定义常数,不能像变量那样赋值,但每在模块内定义常数,不能像变量那样赋值,但每个模块实例的参数值可以在编译阶段被重载(个模块实例的参数值可以在编译阶段被重载(defparam)parameter cache_line_width=256;/ / /定义高速缓冲器宽度定义高速缓冲器宽度parameter signed 15:0 WIDTH;/把参数把参数WIDTHWIDTH规定为有正负号,规定为有正负号, 宽度为宽度为
12、1616位位局部参数使用局部参数使用localparam定义,值不能改变,不能通过参数重载或定义,值不能改变,不能通过参数重载或有序参数列表或命名参数赋值来直接修改有序参数列表或命名参数赋值来直接修改例:状态机的状态编码例:状态机的状态编码loacalparam state1=4b0001, state2=4b0010, state3=4b0100, state4=4b1000;Verilog语言语言 参数值的改写参数值的改写( (方法之一方法之一) )举例说明举例说明: :module mod ( out, ina, inb);parameter cycle = 8, real_consta
13、nt=2.039, file = “/user1/jmdong/design/mem_file.dat”;endmodulemodule test; mod mk(out,ina,inb); defparam mk.cycle=6, mk.file=“./my_mem.dat”; endmodule Verilog语言语言 参数值的改写参数值的改写( (方法方法之二之二) )举例说明举例说明: :module mod ( out, ina, inb);parameter cycle = 8, real_constant=2.039, file = “/user1/jmdong/design/m
14、em_file.dat”;endmodulemodule test; mod # (5, 3.20, “./my_mem.dat”) mk(out,ina,inb); endmoduleVerilog语言语言模块模块DUTDUT的边界的边界输入口输入口输出口输出口输出输出/ /入口入口netnet/registernet/registernetinoutVerilog语言语言 8) 端口端口netnet可可以以将将端端口口看看成成是是由由相相互互连接的两个部分组成。连接的两个部分组成。输入口(输入口(input)对于模块内部,必须为线网类型;从模块外部看,可以为线网或对于模块内部,必须为线网类
15、型;从模块外部看,可以为线网或reg型型输出口输出口 (output)从模块内部看,可以是线网或从模块内部看,可以是线网或reg型;从外部看,必须为线网类型型;从外部看,必须为线网类型输入输入/输出口输出口(inout)从模块内部看,必须为线网类型;从外部看,也必须为线网类型从模块内部看,必须为线网类型;从外部看,也必须为线网类型对模块调用时,对模块调用时,Verilog允许端口的内、外具有不同的位宽,但允许端口的内、外具有不同的位宽,但Verilog仿真器会对此警告仿真器会对此警告Verilog允许模块实例的端口保持未连接状态,如调试端口允许模块实例的端口保持未连接状态,如调试端口例:例:f
16、ulladd4 fa0 (SUM, ,A,B,C_IN);Verilog语言语言端口与外部信号的连接端口与外部信号的连接定义端口列表中的定义端口列表中的sumsum,c_outc_out,a a,b b,c_inc_in具有完全一致的顺序具有完全一致的顺序Verilog语言语言非顺序端口连接非顺序端口连接Verilog语言语言m1(SR_latch)激励(根层)激励(根层)n1(nand)n2(nand)Q, Qbar,S,Rq, qbar,set,resetVerilog语言语言 8) 层次命名层次命名stimulusstimulus.qbar stimulus.qstimulus.rese
17、t stimulus.setstimulus.m1.Q stimulus.m1stimulus.m1.S stimulus.m1.Qbarstimulus.n1 stimulus.m1.RVerilog语言语言门级建模门级建模1. 门级(低级抽象层次)门级(低级抽象层次)电路用逻辑门来描述电路用逻辑门来描述 直观性直观性 Verilog描述和电路逻辑图之间一一对应描述和电路逻辑图之间一一对应 Verilog语言通过提供预定义的逻辑门语言通过提供预定义的逻辑门原语原语来支持用户使用来支持用户使用 逻辑门设计电路逻辑门设计电路 Verilog基本门单元(基本门单元(primitives) 大多数大
18、多数ASIC和和FPGA元件库是用这些基本单元开发的。元件库是用这些基本单元开发的。基本单元名称基本单元名称功能功能andornotbufxornandnorxnor Logical And Logical Or Inverter Buffer Logical Exclusive Or Logical And Inverted Logical Or Inverted Logical Exclusive Or Inverted门级建模门级建模门级建模门级建模门级建模门级建模 Verilog的条件基本单元的条件基本单元这四种基本单元只能有三个引脚:这四种基本单元只能有三个引脚:output, in
19、put, enable基本单元名称基本单元名称 功能功能bufif1 条件缓冲器,逻辑条件缓冲器,逻辑 1 使能使能bufif0 条件缓冲器,逻辑条件缓冲器,逻辑 0 使能使能notif1 条件反相器,逻辑条件反相器,逻辑 1 使能使能notif0 条件反相器,逻辑条件反相器,逻辑 1 使能使能门级建模门级建模门级建模门级建模门级建模门级建模门级建模门级建模门实例语句格式门实例语句格式gate_typeinstance_name(term1,term2,.,termN);instance_name为可选项;为可选项;gate_type为前面列出的某种门类型;为前面列出的某种门类型;各各term
20、用于表示与门的输入用于表示与门的输入/输出端口相连的线网或寄存器。输出端口相连的线网或寄存器。同一门类型的多个实例能够在一个结构形式中定义。同一门类型的多个实例能够在一个结构形式中定义。语法如下语法如下: :gate_typeinstance_name1(term11,term12,. .,term1N) ),instance_name2(term21,term22,.,term2N),.instance_nameM(termM1,termM2,.,termMN);门级建模门级建模门门实例实例数数组组门级建模门级建模 多输入门(多输入门(and,nand,nor, or,xor,xnor)多输
21、入门实例语句的语法如下多输入门实例语句的语法如下:multiple_input_gate_typeinstance_name(OutputA,Input1,Input2,.,InputN);门级建模门级建模 多输出门(多输出门(buf,not)实例语句的基本语法如下实例语句的基本语法如下:multiple_output_gate_typeinstance_name(Out1,Out2,.OutN,InputA);门级建模门级建模多路选择器多路选择器i0i2i1i3s1s0out 74253门级建模门级建模多多路路选择选择器器门门级级描述描述门级建模门级建模多路选择器激励模块(略)多路选择器激励
22、模块(略)门级建模门级建模 门门延迟延迟上升延迟上升延迟:在门的输入发生变化的情况下,在门的输入发生变化的情况下,门的输出从门的输出从0,X,Z 变化为变化为1所需的时间所需的时间下降延迟下降延迟:门的输出从门的输出从1,X,Z 变化为变化为0所所需的时间需的时间关断延迟关断延迟:门的输出从门的输出从0,1 , X 变化为变化为Z所所需的时间需的时间任何值变化到不确定值任何值变化到不确定值X,所需时间可以看为以上三种延迟值中最小的那个,所需时间可以看为以上三种延迟值中最小的那个门级建模门级建模Verilog中中门门延迟延迟说明说明类型类型例例:门级建模门级建模总结总结:门级建模门级建模最小最小
23、/ /典型典型/ /最大延迟(对前面每类延迟来描述)最大延迟(对前面每类延迟来描述)排列形式排列形式(最小:典型:最大)(最小:典型:最大)门级建模门级建模实例实例Dbaceout#4#5Verilog描述描述测试激励模块测试激励模块门级建模门级建模模块的测试模块的测试被测模块被测模块激激励励和和控控制制信号信号输输出出响响应应和验证和验证测试模块常见的形式:测试模块常见的形式: module t; reg ; / 被测模块输入被测模块输入/输出变量类型定义输出变量类型定义 wire; / 被测模块输入被测模块输入/输出变量类型定义输出变量类型定义 initial begin fork joi
24、n end / 产生生测试信号信号 Testedmd m(.in1(ina), .in2(inb), .out1(outa), .out2(outb) );/ 被被测模模块的的实例例引引用用 initial begin . end / 记录输出和响出和响应 endmodule嵌套块嵌套块模块的测试模块的测试激励信号的激励信号的描述描述: module t; reg a, b, sel; wire out;/引用多路器实例引用多路器实例 mux2_m (out, a, b, sel);/加入激励信号加入激励信号 initial begin a=0; b=1; sel=0; #10 b=0; #1
25、0 b=1; sel=1; #10 a=1; #10 $stop; end模块的测试模块的测试观察被测模块的响应:观察被测模块的响应:$time 返回当前的仿真时刻返回当前的仿真时刻$monitor 只只要要在在其其变变量量列列表表中中有有某某一一个个或或某某几几个个变变量量值值发发生生变变化化,便便在在仿仿真单位时间结束时显示其变量列表中所有变量的值。真单位时间结束时显示其变量列表中所有变量的值。 initial begin $monitor ($time, , “out=%b a=%b sel=%b”, out,a,b,sel); end模块的测试模块的测试如何把被测模块的输出变化记录到数
26、据库文件中?如何把被测模块的输出变化记录到数据库文件中?可用以下几个系统任务:可用以下几个系统任务:$fopen(“”); /打开记录数据变化的数据文件打开记录数据变化的数据文件$fdisplay(,p1,p2,pn); /写文件写文件$fmonitor(,p1,p2,pn); /写文件写文件 $fclose (); /关闭关闭文件文件 %m /显示层次显示层次$strobe /选通显示选通显示模块的测试模块的测试值值变变转转储储文件(文件(VCDVCD):):$dumpfile(“file.dump”); /打开打开VCD数据库用于记录数据库用于记录$dumpvars(); /选选择择需要记
27、录的模块实例或模块实例信号需要记录的模块实例或模块实例信号$dumpflush; /将将VCD数数据保存到磁盘据保存到磁盘$dumpoff; /停止记录数据变化停止记录数据变化$dumpon; /重重新新开始记录数据变化开始记录数据变化$dumplimit(); /规定规定VCD文件的大小文件的大小(字节字节)$dumpall; /记录所有指定信号的变化值记录所有指定信号的变化值模块的测试模块的测试下面的下面的 Verilog 代码段可以代替测试文件中的系统任代码段可以代替测试文件中的系统任务务$monitor initial begin $dumpfile(“vlog.dump”);); $
28、dumpvars(0,top); end模块的测试模块的测试0代表转储代表转储top下下各层的所有信号各层的所有信号1.连续赋值语句连续赋值语句数据流建模的基本语句,数据流建模的基本语句,用于对线网赋值用于对线网赋值。必须以关键词。必须以关键词assign开开始,语法如下:始,语法如下:continuous_assign :=assign drive_strength delay3 list_of_net_assignments;list_of_net_assignments :=net_assignment ,net_assignmentnet_assignment :=net_value=
29、expressiondrive_strength是可选项,默认为是可选项,默认为strong1和和strong0delay3也可选,用于指定赋值的延迟也可选,用于指定赋值的延迟数据流级建模数据流级建模强度相同信号度相同信号间或或Strong0和和Strong1发生生竞争,争,结果果为X只有只有treg类型型线网可具有存网可具有存储强度,度,为large、medium、small模块的测试模块的测试数据流级建模数据流级建模连续赋值语句特点连续赋值语句特点1、连续赋值语句左侧必须是一个标量或向量线网,或标量和向量线网的、连续赋值语句左侧必须是一个标量或向量线网,或标量和向量线网的拼接,不能是向量或
30、向量寄存器拼接,不能是向量或向量寄存器2、连续赋值总处于激活状态,有任一个操作数变化,表达式都会被重新、连续赋值总处于激活状态,有任一个操作数变化,表达式都会被重新计算并赋给左边的线网计算并赋给左边的线网3、操作数可以是标量或向量的线网或寄存器,也可以是函数或调用、操作数可以是标量或向量的线网或寄存器,也可以是函数或调用4、赋值延迟用于控制对线网赋予新值的时间,根据仿真单位进行说明,、赋值延迟用于控制对线网赋予新值的时间,根据仿真单位进行说明,对于描述电路中的时序非常有用对于描述电路中的时序非常有用数据流级建模数据流级建模例:例:数据流级建模数据流级建模 隐式连续赋值隐式连续赋值在线网声明的同
31、时进行赋值在线网声明的同时进行赋值由于线网只能被声明一次,因此对线网的隐式声明赋值只能有一次由于线网只能被声明一次,因此对线网的隐式声明赋值只能有一次数据流级建模数据流级建模 隐隐式式线线网网声明声明如果一个信号被用在连续赋值语句的左侧,则如果一个信号被用在连续赋值语句的左侧,则Verilog编译器认为该信编译器认为该信号是一个隐式声明的线网号是一个隐式声明的线网如果线网被连接到模块的端口上,则如果线网被连接到模块的端口上,则Verilog编译器认为隐式声明线网编译器认为隐式声明线网的宽度等于模块端口的宽度的宽度等于模块端口的宽度数据流级建模数据流级建模2. .延迟延迟 普通赋值延迟普通赋值延
32、迟 在连续赋值语句中说明延迟值在连续赋值语句中说明延迟值惯性延迟惯性延迟:任何小任何小于该延时值的变化于该延时值的变化都不能被传输下去,都不能被传输下去,如果是传输延时没如果是传输延时没有这个限制。有这个限制。(对于惯性延迟对于惯性延迟)惯性延时(惯性延时(inertial delay)通常在信号通过逻辑门的时候发生。)通常在信号通过逻辑门的时候发生。脉冲宽度小于复制延迟的输入变化不会对输出产生影响。脉冲宽度小于复制延迟的输入变化不会对输出产生影响。原语门,开关,连续赋值语句和原语门,开关,连续赋值语句和MIPD(module input port delay)的延迟只能是惯性延迟。的延迟只能
33、是惯性延迟。(对于传输延迟对于传输延迟)传输延时传输延时(Transport delay)相当于信号通过了一条拥有固定延时的相当于信号通过了一条拥有固定延时的传输线传输线数据流级建模数据流级建模 隐式连续赋值延迟隐式连续赋值延迟用隐式连续赋值语句来说明对线网的赋值以及赋值延迟用隐式连续赋值语句来说明对线网的赋值以及赋值延迟 线网声明延迟线网声明延迟在声明线网时指定一个延迟,对该线网的任何赋值都会被推迟指定的时间在声明线网时指定一个延迟,对该线网的任何赋值都会被推迟指定的时间数据流级建模数据流级建模四位脉冲进位计数器的四位脉冲进位计数器的RTL级建模级建模3. 操作符类型操作符类型操作符类型操作
34、符类型符号符号连接及复制操作符连接及复制操作符一元操作符一元操作符算术操作符算术操作符逻辑移位操作符逻辑移位操作符关系操作符关系操作符相等操作符相等操作符按位操作符按位操作符逻辑操作符逻辑操作符条件操作符条件操作符 ! & | & | * / %* / %+ -+ - = = = = = = = != = = = = = != != =!= =& & | | &|?: :最高最高最低最低优优先先级级注意注意“与与”操作符的操作符的优先级总是比相同类优先级总是比相同类型的型的“或或”操作符高。操作符高。数据流级建模数据流级建模+ +加加- -减减* *乘乘/ /除除% %模模 将负数赋值给将负数
35、赋值给regreg或其它无符号或其它无符号变量时用变量时用2 2的补码算术。的补码算术。 如果操作数的某一位是如果操作数的某一位是x x或或z z,则结果为则结果为x x 在整数除法中,余数舍弃在整数除法中,余数舍弃 模运算中使用第一个操作数的模运算中使用第一个操作数的符号符号 算术操作符算术操作符数据流级建模数据流级建模module arithops (); parameter five = 5; integer ans, int; reg 3: 0 rega, regb; reg 3: 0 num; initial begin rega = 3; regb = 4b1010; int =
36、-3; /int = 11111111_1101 end initial fork #10 ans = five * int; / ans = -15 #20 ans = (int + 5)/ 2; / ans = 1 #30 ans = five/ int; / ans = -1 #40 num = rega + regb; / num = 1101 #50 num = rega + 1; / num = 0100 #60 num = int; / num = 1101 #70 num = regb % rega; / num = 1 #80 $finish;joinendmodule注意注
37、意integerinteger是是有符号数,而有符号数,而regreg是无符号数。是无符号数。not&and|orxor xnor xnormodule bitwise (); reg 3: 0 rega, regb, regc; reg 3: 0 num; initial begin rega = 4b1001; regb = 4b1010; regc = 4b11x0; end initial fork #10 num = rega & 0; / num = 0000 #20 num = rega & regb; / num = 1000 #30 num = rega | regb; /
38、num = 1011 #40 num = regb & regc; / num = 10x0 #50 num = regb | regc; / num = 1110 #60 $finish; joinendmodule 按位操作符对矢量中相对应位运算。按位操作符对矢量中相对应位运算。 位值为位值为x x时不一定产生时不一定产生x x结果。结果。当两个操作数位数不同时,位数少的当两个操作数位数不同时,位数少的操作数零扩展到相同位数。操作数零扩展到相同位数。a = 4b1011;b = 8b01010011;c = a | b; / a零扩展为零扩展为 8b00001011 按位操作符按位操作符数
39、据流级建模数据流级建模module logical (); parameter five = 5; reg ans; reg 3: 0 rega, regb, regc; initial begin rega = 4b0011; /逻辑值为“1” regb = 4b10xz; /逻辑值为“1” regc = 4b0z0x; /逻辑值为“x” end initial fork #10 ans = rega & 0; / ans = 0 #20 ans = rega | 0; / ans = 1 #30 ans = rega & five; / ans = 1 #40 ans = regb & r
40、ega; / ans = 1 #50 ans = regc | 0; / ans = x #60 ans=! regb; / ans = 0 #70$finish; joinendmodule!not&and|or 逻辑操作符的结果为逻辑操作符的结果为一位一位1,0或或x。逻辑操作符只对逻辑值运算。逻辑操作符只对逻辑值运算。如操作数为全如操作数为全0,则其逻辑值为则其逻辑值为false如操作数有一位为如操作数有一位为1,则其逻辑值则其逻辑值为为true若操作数若操作数只只包含包含0、x、z,则逻辑,则逻辑值为值为x x 逻辑操作符逻辑操作符数据流级建模数据流级建模module negation
41、(); reg 3: 0 rega, regb; reg 3: 0 bit; reg log; initial begin rega = 4b1011; regb = 4b0000; end initial fork #10 bit = rega; / num = 0100 #20 bit = regb; / num = 1111 #30 log = !rega; / num = 0 #40 log = !regb; / num = 1 #50 $finish; joinendmodule! logical not 逻辑反逻辑反 bit-wise not 位反位反逻辑反的结果为一位逻辑反的结果
42、为一位1,0或或x。位反的结果与操作数的位数相同位反的结果与操作数的位数相同数据流级建模数据流级建模数据流级建模数据流级建模& 缩减与非缩减与非& 缩减与缩减与| 缩减或非缩减或非|缩减或缩减或缩减异或缩减异或 缩减同或缩减同或 缩减同或缩减同或 只有一个操作数只有一个操作数对操作数逐位操作,产生一个一位结果对操作数逐位操作,产生一个一位结果 缩减操作符缩减操作符module shift (); reg 9: 0 num, num1; reg 7: 0 rega, regb; initial rega = 8b00001100; initial fork #10 num = rega 5 ;
43、/ num = 01_1000_0000 #10 regb = rega 5 ; / regb = 1000_0000 #20 num 3; / num = 00_0000_0001 #20 regb 3 ; / regb = 0000_0001 #30 num = 10b11_1111_0000; #40 rega = num 2; /rega = 1100_0000 #40 num1 = num 2;/num1=11_1100_0000 #50 rega 2; /rega = 1111_1100 #50 num1 2;/num1=00_1111_1100 joinendmodule 逻辑右
44、移(非循环)逻辑右移(非循环) 算术右移算术右移3); / /结果为结果为-2,由于算术运算,右移三位,空缺位补由于算术运算,右移三位,空缺位补1数据流级建模数据流级建模module relationals (); reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b0x10; end initial fork #10 val = regc rega ; / val = x #20 val = regb = rega ; / val = 1 #40 val = regb
45、 regc ; / val = 1 #50 $finish; joinendmodule大于大于=大于等于大于等于regcrega和和 regc的的关系取决于关系取决于x 关系操作符关系操作符数据流级建模数据流级建模注意逻辑等与注意逻辑等与case等的差别等的差别2b1x=2b0x 值为值为0,因为不相因为不相等等2b1x=2b1x 值为值为x,因为可能因为可能不相等,也可能相等不相等,也可能相等2b1x=2b0x 值为值为0,因为不相因为不相同同2b1x=2b1x 值为值为1,因为相同因为相同= = 赋值操作符,将等式右边表达式的值拷贝到左赋值操作符,将等式右边表达式的值拷贝到左边。边。=
46、= =逻辑等逻辑等= =01xz010xx101xxxxxxxzxxxx= = = = =case等等= =01xz0100010100x0010z0001a = 2b1x;b = 2b1x;if (a = b) $display( a is equal to b);else $display( a is not equal to b);a = 2b1x;b = 2b1x;if (a = b) $display( a is identical to b);else $display( a is not identical to b);CaseCase等只能用于行为描述,等只能用于行为描述,不能
47、用于不能用于RTLRTL描述。描述。 相等操作符相等操作符数据流级建模数据流级建模!= 逻辑逻辑不等不等module equalities1(); reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; end initial fork #10 val = rega = regb ; / val = 0 #20 val = rega != regc; / val = 1 #30 val = regb != regc; / val = x #40 val = re
48、gc = regc; / val = x #50 $finish; joinendmodule其结果是其结果是1b1、1b0或或1bx。 如果左边及右边为确定值如果左边及右边为确定值并且不相等,则结果为并且不相等,则结果为1。 如果左边及右边为确定值如果左边及右边为确定值并且相等,则结果为并且相等,则结果为0。 如果左边及右边有值不能如果左边及右边有值不能确定的位,但值确定的位相确定的位,但值确定的位相等,则结果为等,则结果为x。!=的的结果与结果与= =相反相反数据流级建模数据流级建模! =不相同不相同(case不等不等)module equalities2(); reg 3: 0 rega
49、, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b1x10; end initial fork #10 val = rega = regb ; / val = 0 #20 val = rega != regc; / val = 1 #30 val = regb = regc; / val = 0 #40 val = regc = regc; / val = 1 #50 $finish; joinendmodule其结果是其结果是1 1b1b1、1 1b0b0或或1 1bxbx。 如果左边及右边
50、的值相同如果左边及右边的值相同(包括(包括x x、z)z),则结果为,则结果为0 0。如果左边及右边的值不相同,如果左边及右边的值不相同,则结果为则结果为1 1。!=!=的结果与的结果与 = = 相反相反综合工具不支持综合工具不支持数据流级建模数据流级建模?: 条件条件module likebufif( in, en, out); input in; input en; output out; assign out = (en = 1) ? in : bz;endmodulemodule like4to1( a, b, c, d, sel, out); input a, b, c, d; in
51、put 1: 0 sel; output out; assign out = sel = 2b00 ? a : sel = 2b01 ? b : sel = 2b10 ? c : d;endmodule 条件操作符条件操作符数据流级建模数据流级建模registger = condition ? true_value:false_value;每个条件操作符必须有三个参数,缺少任何一个都会产生错误。每个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值。最后一个操作数作为缺省值。若若condition为真,则为真,则register=true_value;若若condit
52、ion为假,则为假,则register=false_value;如果条件值不确定,则对两个结果逐位比较,如果条件值不确定,则对两个结果逐位比较, true_value=false_value 则该则该位值为操作数中该位值,位值为操作数中该位值,true_value false_value,则取,则取x x。例如例如:assign out = (sel = 0) ? a : b;若若sel为为0则则out =a;若若sel为为1则则out = b。如果如果sel为为x或或z,若,若a = b =0,则,则out = 0;若若ab,则,则out值不确定。值不确定。数据流级建模数据流级建模 级联从不
53、同矢量中选择位并用它从不同矢量中选择位并用它们组成一个新的矢量。们组成一个新的矢量。module concatenation; reg 7: 0 rega, regb, regc, regd; reg 7: 0 new; initial begin rega = 8b0000_0011; regb = 8b0000_0100; regc = 8b0001_1000; regd = 8b1110_0000; end initial fork #10 new = regc 4: 3, regd 7: 5, regb 2, rega 1: 0; / new = 8b11111111 #20 $fin
54、ish; joinendmodule每个操作数必须有确定位宽每个操作数必须有确定位宽类似类似错误错误的例子的例子: a7:0 = 4 b10; b7:0 = 2 5; ; c3:0 = 3b011, b0;级联时级联时不限定不限定操作数的数目。操作数的数目。在操作符符号在操作符符号 中,用逗号中,用逗号将操作数分开。例如将操作数分开。例如: : A A, B, C, D 级联操作符级联操作符数据流级建模数据流级建模 复制复制复制一个变量或在复制一个变量或在 中的中的值值前两个前两个 符号之间的正整数符号之间的正整数指定复制次数。指定复制次数。 复制复制数据流级建模数据流级建模module re
55、plicate (); reg 3: 0 rega; reg 1: 0 regb, regc; reg 7: 0 bus; initial begin rega = 4b1001; regb = 2b11; regc = 2b00; end initial fork #10 bus = 4 regb; / bus = 11111111 / regb is replicated 4 times. #20 bus = 2 regb, 2 regc ; / bus = 11110000. regc and regb are each / replicated, and the resulting vectors / are concatenated together #30 bus = 4 rega1, rega ; / bus = 00001001. rega is sign-extended #40 $finish; joinendmodule数据流级建模数据流级建模用逻辑方程描述四选一多路选择器用逻辑方程描述四选一多路选择器数据流级建模数据流级建模用条件操作语句描述四选一多路选择器用条件操作语句描述四选一多路选择器四选一四选一激励模块激励模块