2020/1/23GUETSchoolofInformation&Communications1硬件描述语言及其在数字系统中的应用主讲:谢跃雷(副教授)2020/1/23GUETSchoolofInformation&Communications2第四讲数据流建模连续赋值语句表达式、操作符数据流建模实例2020/1/23GUETSchoolofInformation&Communications3门级建模特点:优点:直接简洁在电路规模较小时,对于有数字逻辑电路基础的设计来说,门级建模简单直观。缺点:电路规模较大时,繁琐易错,需要考虑高层次建模数据流(dataflow)建模:描述数据在寄存器间的流动和处理过程。当今设计公司已经不在从门级结构角度进行设计,而是从更高的抽象层次设计,典型的是RTL(RegisterTransferLevel)设计,通常指的是数据流建模和行为建模的结合。2020/1/23GUETSchoolofInformation&Communications44.1连续赋值语句连续赋值语句是verilog数据流建模的基本语句,用于对线网进行赋值。它等价于门级描述,然而是从更高的抽象角度来对电路进行描述。连续赋值语句必须以关键词assign开始,其语法如下:assign[delay]target=expression;连续赋值语句的左值必须是一个标量或向量线网,或者是标量或向量线网的拼接,而不能是标量或向量寄存器连续赋值语句特点:1.连续赋值语句2020/1/23GUETSchoolofInformation&Communications5连续赋值语句总是处于激活状态。只要任意一个操作数发生变化,表达式就会被立即重新计算,并且将结果赋给等号左边的线网;操作数可以是标量或向量的线网或寄存器,也可以是函数调用;赋值延迟用于控制对线网赋予新值的时间,根据仿真时间单位进行说明。赋值延迟类似于门延迟.对于描述实际电路中的时序是非常有用的。//连续赋值语句,out是线网,i1和i2也是线网wireout,i1,i2;assignout=i1&i2;//连续赋值语句,adr是线网,adr1_bits和adr2_bits是寄存器assignadr[15:0]=adr1_bits[15:0]^adr2_bits[15:0];2020/1/23GUETSchoolofInformation&Communications6//连接操作,左边是一个标量线网和一个向量线网拼接assign{c_out,sum[3:0]}=a[3:0]+b[3:0]+c_in;隐式连续赋值//连续赋值语句,out是线网,i1和i2也是线网wireout;assignout=i1&i2;//隐式连续赋值语句wireout=i1&i2;等价//连续赋值语句,i1和i2也是线网wirei1,i2;assignout=i1&i2;//out被自动认为是线网类型2020/1/23GUETSchoolofInformation&Communications72.延迟连续赋值语句中的延迟用于控制任一操作数发生变化到语句左值被赋予新值之间的时间间隔指定赋值延迟的方法有三种:隐式赋值延迟和线网声明延迟。普通赋值延迟://连续赋值语句,out是线网,in1和in2也是线网wireout,in1,in2;assign#10out=in1&in2;in1in2outxxxxxxx10203060708085时间in1和in2任一发生变化,计算in1&in2新值赋于左边,会有10个单位延迟。在10单位延迟期间,若in1和in2再次变化,则取in1和in2当前值计算。也就是说,小于延迟的输入脉冲不影响输出2020/1/23GUETSchoolofInformation&Communications8隐式连续赋值延迟://隐式连续赋值语句wire#10out=i1&i2;线网声明延迟://连续赋值语句,out是线网,i1和i2也是线网Wire#10out;assignout=i1&i2;//连续赋值语句,out是线网,i1和i2也是线网wireout,i1,i2;assign#10out=i1&i2;2020/1/23GUETSchoolofInformation&Communications94.2表达式、操作符和操作数数据流建模使用表达式而不是门级原语来描述设计。表达式、操作符和操作数构成了数据流建模的基础。表达式:由操作符和操作数构成,目的是根据操作符计算出一个值。操作数:可以是定义过的任何数据类型,有时要根据操作符的要求限制。操作符:对操作数进行运算并产生一个结果。2020/1/23GUETSchoolofInformation&Communications101.操作符类型下表以优先级顺序列出了Verilog操作符。注意“与”操作符的优先级总是比相同类型的“或”操作符高。操作符类型符号连接及复制操作符一元操作符算术操作符逻辑移位操作符关系操作符相等操作符按位操作符逻辑操作符条件操作符{}{{}}!~&|^*/%+-=======!=!==&^~^|&&||?:最高最低优先级2020/1/23GUETSchoolofInformation&Communications112.Verilog中的大小(size)与符号Verilog根据表达式中变量的长度对表达式的值自动地进行调整。Verilog自动截断或扩展赋值语句中右边的值以适应左边变量的长度。当一个负数赋值给无符号变量如reg时,Verilog自动完成二进制补码计算modulesign_size;reg[3:0]a,b;reg[15:0]c;……..a=-1;//a是无符号数,因此其值为1111b=8;c=8;//b=c=1000#10b=b+a;//结果10111截断,b=0111#10c=c+a;//c=16’b10111……..endmodule2020/1/23GUETSchoolofInformation&Communications123.算术操作符modulearithops();parameterfive=5;integerans,int;reg[3:0]rega,regb;reg[3:0]num;initialbeginrega=3;regb=4'b1010;int=-3;//int=1111……1111_1101endinitialfork#10ans=five*int;//ans=-15#20ans=(int+5)/2;//ans=1#30ans=five/int;//ans=-1#40num=rega+regb;//num=1101#50num=rega+1;//num=0100#60num=int;//num=1101#70num=regb%rega;//num=1#80$finish;joinendmodule+加-减*乘/除%模•将负数赋值给reg或其它无符号变量使用2进制的补码算术。•如果操作数的某一位是x或z,则结果为x•在整数除法中,余数舍弃•模运算中使用第一个操作数的符号注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。2020/1/23GUETSchoolofInformation&Communications134.按位操作符modulebitwise();reg[3:0]rega,regb,regc;reg[3:0]num;initialbeginrega=4'b1001;regb=4'b1010;regc=4'b11x0;endinitialfork#10num=rega&0;//num=0000#20num=rega®b;//num=1000#30num=rega|regb;//num=1011#40num=regb®c;//num=10x0#50num=regb|regc;//num=1110#60$finish;joinendmodule1~not&and|or^xor~^xnor^~xnor•按位操作符对矢量中相对应位运算。regb=4'b1010regc=4'b1x10num=regb®c=1010;•位值为x时不一定产生x结果。当两个操作数位数不同时,位数少的操作数零扩展到相同位数。a=4'b1011;b=8'b01010011;c=a|b;//a零扩展为8'b000010112020/1/23GUETSchoolofInformation&Communications145.逻辑操作符modulelogical();parameterfive=5;regans;reg[3:0]rega,regb,regc;initialbeginrega=4‘b0011;//逻辑值为“1”regb=4‘b10xz;//逻辑值为“1”regc=4‘b0z0x;//逻辑值为“x”endinitialfork#10ans=rega&&0;//ans=0#20ans=rega||0;//ans=1#30ans=rega&&five;//ans=1#40ans=regb&®a;//ans=1#50ans=regc||0;//ans=x#60$finish;joinendmodule!not&&and||or•逻辑操作符的结果为一位1,0或x。•逻辑操作符只对逻辑值运算。•如操作数为全0,则其逻辑值为false•如操作数有一位为1,则其逻辑值为true•若操作数只包含0、x、z,则逻辑值为x逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。2020/1/23GUETSchoolofInformation&Communications156.逻辑反与位反的对比modulenegation();reg[3:0]rega,regb;reg[3:0]bit;reglog;initialbeginrega=4'b1011;regb=4'b0000;endinitialfork#10bit=~rega;//num=0100#20bit=~regb;//num=1111#30log=!rega;//num=0#40log=!regb;//num=1#50$finish;joinendmodule!logicalnot逻辑反~bit-wisenot位反•逻辑反的结果为一位1,0或x。•位反的结果与操作数的位数相同逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。2020/1/23GUETSchoolofInformation&Communications167.一元归约操作符modulereduction();regval;reg[3:0]rega,regb;initialbeginrega=4'b0100;regb=4'b1111;endinitialfork#10val=®a;//val=0#20val=|rega;//val=1#30val=®b;//val=1#40val=|regb;//val=1#50val=^rega;//val=1#60val=^regb;//val=0#70val=~|rega;//(nor)val=0#80val=~®a;//(nand)val=1#90val=^rega&&®b;//val=1$finish;joinendmodule&and|or^xor~^xnor^~xnor•归约操作符的操作数只有一个。•对操作数的所有位进行位操作。•结果只有一位,可以是0,1,X。2020/1/23GUETSchoolofInformation&Communications178.移位操作符moduleshift();reg[9:0]num,num1;reg[7:0]rega,regb;initialrega=8'b00001100;i