SystemVerilog硬件设计及建模-第34章.ppt

上传人:za****8 文档编号:13190203 上传时间:2020-06-07 格式:PPT 页数:51 大小:301.96KB
返回 下载 相关 举报
SystemVerilog硬件设计及建模-第34章.ppt_第1页
第1页 / 共51页
SystemVerilog硬件设计及建模-第34章.ppt_第2页
第2页 / 共51页
SystemVerilog硬件设计及建模-第34章.ppt_第3页
第3页 / 共51页
点击查看更多>>
资源描述
增强的文本值改进的define文本替换时间值新的变量类型有符号和无符号类型静态和动态变量类型转换常数,第3章SystemVerilog文本值和数据类型,3.1增强的文本赋值,Verilog中的向量赋值:,parameterSIZE=64;regSIZE1:0data;data=0;/将数据各位置0data=bz;/将数据各位置zdata=bx;/将数据各位置x,但如何给data赋全1的值?data=64hFFFFFFFFFFFFFFFF;/不可扩展,如果/SIZE改为128呢?,data=0;/1的补码data=-1;/2的补码,3.1增强的文本赋值,SystemVerilog在向量赋值的增强:1.可以只指定要赋的值,不用指定进制2.赋值可以是逻辑1,该语法指定所有位所赋的值,parameterSIZE=64;regSIZE1:0data;data=0;/将数据各位置0data=1;data=z;/将数据各位置zdata=x;/将数据各位置x,3.2define增强,Verilog允许在define宏中使用双引号,但是双引号内的文本变成了文本串,即在verilog中不能采用在字符串中嵌入宏变量的文本替换宏创建字符串,defineprint(v)$display(“variablev=%h”,v)print(data);/$display(“variablev=%h”,data);,SystemVerilog允许字符串内的宏变量替换!,defineprint(v)$display(“variablev=%h”,v)print(data);/$display(“variabledata=%h”,data);,3.2define增强,SystemVerilog允许在包含变量替换的宏文本字符串中使用隔离引号,SV中如何通过宏定义实现下面与Verilog相同功能的语句?,$display(“variable”data”=%h”,data);,defineprint(v)$display(“variable”v”=%h”,v)print(data);,$display(“variable”data”=%h”,data);,3.2define增强,SystemVerilog可以提供了一个不引入空格的方法,通过使用两个连续的重音符号,使两个或多个文本宏连接成一个新名字,bitd00_bit;wandd00_net=d00_bit;bitd01_bit;wandd01_net=d01_bit;.bitd62_bit;wandd62_net=d62_bit;bitd63_bit;wandd63_net=d63_bit;defineTWO_STATE_NET(name)bitname_bit;wandname_net=name_bit;TWO_STATE_NET(d00);,3.3SystemVerilog变量,对象类型和数据类型SystemVerilog四态变量SystemVerilog两态变量显式及隐式变量和线网类型综合指导,3.3.1对象类型和数据类型,对象类型指明信号是变量还是线网;数据类型指明变量或线网的值系统:两态数据类型或四态数据类型,Verilog数据类型:变量:integer,reg,time线网:wire,wor,wand,SystemVerilog数据类型:包含了所有的Verilog数据类型增加了一些新数据类型:byte,int,logic,3.3.2SystemVerilog四态变量,SystemVerilog用logic关键字描述通用的针对硬件的数据类型,logic数据类型变量与Verilog中的reg类型是大多数情况下可以互换使用,logic类型变量声明:logicresetN;/一位四态变量logic63:0data;/64位宽变量logic0:7array0:255;/8位数组变量,显式变量或线网声明:varlogic63:0addr;/64位宽变量wirelogic63:0addr;/64位宽线网,Whylogic?,3.3.3SystemVerilog两态变量,适合于更高抽象层次建模,如系统级和交易级,bit1位两态整数byte8位两态整数,与C语言的char类似shortint16位两态整数,与C语言的short类似int32位两态整数,与C语言的int类似longint64位两态整数,与C语言的long类似,bitresetN;bit63:0data;bit0:7array0:255;varbit63:0addr;,3.3.3SystemVerilog两态变量,类似C语言类型优点:类似C语言的两态类型如int和byte,主要用来描述更抽象的总线功能模型,不需要描述硬件细节,如三态总线及可能产生逻辑值X的硬件冲突易于使用SystemVerilog的直接编程接口(DPI),建立Verilog到C或C+的接口,因为数据类型相同,所以数据在两语言间的传递更简单有效for语句中的循环变量,综合后就消失了,int类型是一个很好的选择,3.3.4显式及隐式变量和线网类型,声明语句中,数据类型前没有显式指定对象类型时,则推断为隐式变量logic7:0busA;bit31:0busB;varlogic7:0;varbit31:0b;typedefenumbitFALSE,TRUEbool_t;varbool_tc;var7:0d;/四态8位变量wire31:0busB;/隐含为四态逻辑数据类型wirelogic31:0busC;,两态线网问题wirereg31:0busD;,3.4RTL中使用两态类型,SystemVerilog新增加的两态类型可以用于设计抽象建模,这种情况下很少用到三态值,可能导致不确定值或不可预测值(X)的电路不会出现。,SystemVerilog允许给一个两态类型赋四态值,其映射关系如下:,3.4.1两态类型和四态类型仿真,1.两态模式仿真器:软件工具在设计模型不需要使用逻辑Z和X时提供的仿真模式,提高仿真速度,2.多数两态模式仿真器通常不能使用两态与四态混合仿真,3.不同两态模式仿真器将Z和X映射到两态类型时可能不同,导致仿真结果不同4.两态仿真模式对casez和casex解释不同,从而导致仿真结果不同5.SystemVerilog中标准两态类型为所有软件工具提供相同的行为,同时,四态到两态的映射也是标准化的,因此所有软件工具仿真结果也是一致的,3.4.2case语句中使用两态类型,缺省赋值两个优点:其一是综合会将条件选择项的译码逻辑进行优化,不会考虑缺省分支条件表达的值如何译码;其二是缺省X赋值有助于检测RTL模型中的设计错误,case(state)RESET:next=WAIT;WAIT:next=LOAD;LOAD:next=DONE;DONE:next=WAIT;default:next=4bx;/不定态endcase,但如果是两态变量呢?!给两态变量赋一个X值如何?,3.5数据类型规则的放宽,SystemVerilog简化了模型中数据类型的使用,任何数据类型的变量都可以通过下列方式赋值:,initial或always过程块中赋值在单个always_comb,always_ff或always_latch过程块中赋值通过单个模块或原语的output/inout端口驱动赋值,大部分信号可以声明为变量类型!,3.5数据类型规则的放宽,modulecompare(outputlogiclt,eq,gt,inputlogic63:0a,b);always(a,b)if(ab);/连续赋值comparatoru1(eq,a,b);/模块例化endmodulemodulecomparator(outputlogiceq,inputlogic63:0a,b);always(a,b)eq=(a=b);endmodule,3.5数据类型规则的放宽,对变量使用的限制可以防止设计错误:多个输出端口驱动一个变量;对一个变量进行多次连续赋值;对同一个变量同时进行过程赋值和连续赋值moduleadd_and_increment(outputlogic63:0sum,outputlogiccarry,inputlogic63:0a,b);always(a,b)sum=a+b;/过程赋值assignsum=sum+1;/error,sum已经被过程赋值一次look_aheadi1(carry,a,b);/carry被驱动一次overflow_checki2(carry,a,b);/error,carry再一次被驱动endmodulemoduleloock_ahead(outputwirecarry,.endmodulemoduleoverflow_check(outputwirecarry,.endmodule,3.6有符号和无符号修饰符,integerj;/verilog-1995标准,32位有符号数reg63:0u;/无符号64位数regsigned63:0s;/有符号64位数,verilog-2001标准SystemVerilog增加了缺省为有符号数的数据类型:byte,shortint,int和longintints_int;/有符号32位变量intunsignedu_int;/无符号32位变量与verilog相同,SystemVerilog只能在类型关键字后面指定signed或unsigned关键字,与C语言不同!,3.7静态变量和自动变量,verilog-1995标准中,所有数据类型都是静态的verilog-2001标准中在任务和函数中添加了自动变量自动变量特点是其存储区在需要时由软件工具动态分配,不需要时被释放,因此也被称为动态变量。自动变量用途:1.用于描述在测试程序、抽象系统级、交易级或总线功能模型中的验证程序2.用于编写可重入任务或递归函数,3.7静态变量和自动变量,平衡加法器:把数组的所有元素加在一起,被加的数组元素高、低地址作为函数的输入。functionautomaticintb_add(intlo,hi);intmid=(lo+hi+1)1;if(lo+1!=hi)return(b_add(lo,(mid1)+b_add(mid,hi);elsereturn(arraylo+arrayhi);endfunction,3.7静态变量和自动变量,SystemVerilog增加了关键字static,允许任何变量显式被声明为static或automatic,这个声明可以出现在任务、函数、beginend块或forkjoin块中,但在module一级声明的变量不能显式地声明为static或automatic,在module级,所有变量都是静态的!functionintcount_ones(input31:0data);automaticlogic31:0count=0;automaticlogic31:0temp=data;for(intj=0;j=1;endreturncount;endfunction,3.7静态变量和自动变量,检查程序运行总错误数任务:typedefstructpackedpacket_t;taskautomaticcheck_results(inputpacket_tsent,received,outputinttotal_errors);staticinterror_count=0;if(sent!=received)error_count+;total_errors=error_count;endtask,SystemVerilog缺省存储方式与Verilog兼容,在模块、beginend块、forkjoin块以及非自动任务和函数中,缺省存储方式为静态的,如果一个任务和函数被声明自动的,则缺省存储方式的自动的。,3.7.1静态变量和自动变量的初始化,SystemVerilog对Verilog进行了扩展,在模块、任务、函数中声明的变量可以有内嵌初始值,静态变量只初始化一次,自动变量每次调用时都初始化,functionintcount_ones(input31:0data);logic31:0count=0;logic31:0temp=data;for(intk=0;k=31;k+)beginif(temp0)count+;endreturncount;endfunction,上述程序不能正确工作:第一次调用时,count初始为0,再次调用时,静态变量count保持上次调用时的值,从而导致计数错误,静态变量初始化是不可综合的,动态变量初始化是可综合的!,3.7.2静态变量和自动变量使用原则,在always和initial块中,如果无内嵌初始化则使用静态变量,而需要内嵌初始化则使用自动变量如果一个任务或函数是可重入的,则应设成自动的,变量也应是自动的,除非要在两次调用之间保持变量的值如果一作任务或函数用来描述硬件的独立部分,并且不是可重入的,则应声明为静态的,任务或函数中的变量也应是静态,3.8变量初始化的确定性,Verilog初始化不确定SystemVerilog内嵌初始化在时间0之前Verilog内嵌初始化可能引起事件,SystemVerilog不引起事件SystemVerilog内嵌初始化是确定的,integerj=5;integerk;/integerk=j;initialk=j;/initial/k=j;,logicresetN=0;always(posedgeclk,negedgeresetN)if(!resetN)count=0;elsecount=count+1;,resetN初始与always过程谁先被仿真器激活,表现的结果是不同的!,3.8.1时序逻辑的异步输入初始化,modulecounter(inputwireclk,resetN,outputlogic15:0count);always(posedgeclk,negedgeresetN)if(!resetN)count=0;elsecount=count+1;endmodulemodulecounter_test;wire15:0count;bitclk;bitresetN=1;countercounter_1(clk,resetN,count);always#10clk=clk;initialbeginresetN=0;#2resetN=1;$display(“ncount=%0d(expect0)n”,count);endendmodule,对Verilog来说,该程序执行具有不确定性,WHY?,3.9强制类型转换,verilog是弱类型语言,允许一个数据类型的值赋给另一个数据类型的变量或线网,新值按verilog标准中定义的规则转换,强制转换不同于赋值时转变数值,它可以在表达式内,将一个数值转换成一个新的类型!,3.9.1静态转换(编译时转换),SystemVerilog加入了一个强制转换操作符,用于将一个值强制转换为其它类型,数据类型强制转换:()7+int(2.0*3.0);向量宽度强制转换:()logic15:0a,b,y;y=a+b*16(2);符号强制转换:()shortinta,b;inty;y=ysigned(a,b);,3.9.1动态强制类型转换,SystemVerilog提供了一个系统函数$cast,在运行时能够进行待转换数值的检查,$cast(dest_var,source_exp);intradius,area;always(posedgeclk)$cast(area,3.154*radius*2);typedefenums1,s2,s3states_t;states_tstate,next_state;always_latchbegin$cast(next_state,state+1);end,$cast可以作为任务被调用$cast可以作为函数被调用$cast作为函数被调用时,会返回一个转换成功与否标志$cast不能和直接修改源表达式的操作符一块使用,如+,+=等$cast语句不可综合!,3.10常数,verilog提供三种类型常数:parameter,specparam和localparam,paramter可以在确立时使用defparam或内嵌参数重定义修改的常数Specparam是一个可以在确立时从SDF文件中重定义的常数Localparam是确立期常数,可以基于其它常数,但不能重定义verilog限制这些常数不能在自动任务或函数、beginend、forkjoin中声明,3.10常数,SystemVerilog加入了一个类似C语言风格的const声明,可以将任何变量声明为常数,有确立完成之后才被赋值,并且可以在自动任务或函数、beginend、forkjoin中声明,constlogic23:0c1=7;constintc2=15;constrealc3=3.14;constc4=5;/error,无数据类型taskautomaticC;constintN=5;endtask,SystemVerilog允许用户定义新的变量和线网类型,从而能够在更高的抽象线上进行复杂的设计,使用用户自定义数据类型,可以用更少的代码完成更多的设计功能,并且代码的自文档性和可读性更好。,使用typedef建立用户自定义类型使用enum建立枚举类型枚举值的使用,第4章用户自定义和枚举数据类型,4.1用户自定义类型,Verilog没有提供用户自行扩展语言变量和线网类型机制,其数据类型主要用于RTL和门级建模,SystemVerilog除增加了许多新数据类型外,还可以用typedef关键字来建立用户自定义类型,新类型定义后,可以声明这个类型的变量,如:typedefintunsigneduint;uinta,b;/uint类型的两个变量,4.1.1局部typedef声明,用户自定义类型可以在局部定义,也可以在编译单元域进行外部定义。当一个用户自定义类型只用于设计的特定部分时,typedef的定义可以在模块或设计的接口部分。modulealu();typedeflogic3:0nibble;nibbleopA,opB;nibble7:0data;/由8个nibble类型组成的32位向量endmodule,nibble只有alu模块中可见,其它模块完全可以用nibble表示其它的意思,4.1.2共享typedef定义,如果一个用户自定义类型会在很多不同的模块或接口是使用,可以把typedef声明放在package或$unit中声明。packagechip_types;ifdefTWO_STATEtypedefbitdtype_t;elsetypedeflogicdtype_t;endifendpackage,4.1.2共享typedef定义,modulecounter(outputchip_types:dtype_t15:0count,inputchip_types:clock,resetN);always(posedgeclock,negedgeresetN)if(!resetN)count=0;elsecount=count+1;endmodule,inportchip_types:*;modulecounter(outputdtype_t15:0count,inputclock,resetN);always(posedgeclock,negedgeresetN)if(!resetN)count=0;elsecount=count+1;endmodule,4.2枚举数据类型,枚举数据类型提供了一种方式来声明一个具有特定允许值列表的抽象变量,每一个值都有一个确定的用户自定义名字,即标签(label)。Verilog语言没有枚举类型,为了给数值创建一个标签,必须定义parameter常数来表示每个值,并且将值赋给常数(标识符),define文本替换是另一种把标识符与值对应的方法,4.2枚举数据类型,defineFETCH3H0defineWRITE3H1defineADD3H2defineSUB3H3defineMULT3H4defineDIV3H5defineSHIFT3H6defineNOP3H7modulecontroller(outputregread,write,inputwire2:0instruction,inputwireclk,resetN);parameterWAIT=0,LOAD=1,STORE=2;reg1:0state,nextState;,4.2枚举数据类型,always(posedgeclk,negedgeresetN)if(!resetN)state=WAIT;elsestate=nextState;always(state)begincase(state)WAIT:nextState=LOAD;LOAD:nextState=STORE;STORE:nextState=WAIT;endcaseendalways(state,instruction)beginread=0;write=0;if(state=LOADendendmodule,state和nextState只取三个值吗?,4.2枚举数据类型,packagechip_types;typedefenumFETCH,WRITE,ADD,SUB,MULT,DIV,SHIFT,NOPinstr_t;endpackageimportchip_types:*;modulecontroller(outputlogicread,write,inputinstr_tinstruction,inputwireclk,resetN);enumWAIT,LOAD,STOREstate,nextState;always_ff(posedgeclk,negedgeresetN)if(!resetN)state=WAIT;elsestate=nextState;always_combbegincase(state)WAIT:nextState=LOAD;LOAD:nextState=STORE;,4.2枚举数据类型,STORE:nextState=WAIT;endcaseendalways_combbeginread=0;write=0;if(state=LOADendendmodule,枚举类型限制数值的合法集合,例子中state,nextState只能有WAIT、LOAD、STORE三种值,所有软件工具都使用相同的方式解释对于枚举类型变量合法值的约束!,4.2枚举数据类型,枚举类型标签作用域:枚举类型列表中的标签在其作用域内必须是唯一的,可以包含枚举类型声明的作用域包括编译单元、模块、接口,任务、函数、beginend块和forkjoin块,moduleFSM();enumGO,STOPfsm1_state;enumWAIT,GO,DONEfsm2_state;endmodule,?,4.2枚举数据类型,枚举类型相标签代码的值:枚举类型标签缺省情况下代表的实际数值是一个int类型的整数,第一个标签表示数值0,第二个为1,以此类推。SystemVerilog支持显式地说明标签表示的数值,如:,enumONE=1,FIVE=5,TEN=10state;enumA=1,B,C,X=24,Y,Zlist1;/B=?,C=?,Y=?,Z=?enumA=1,B,C,D=3;list2;,枚举列表中的各个标签必须具有唯一的值!,4.2枚举数据类型,枚举类型的基类:枚举类型是具有一系列标签值的变量或线网,其缺省的基类是int类型,SystemVerilog允许对枚举类型的基类进行显式的声明。,enumbitFALSE,TRUEboolean;enumlogic1:0WAIT,LOAD,READYstate;enumlogic2:0WAIT=3b001,LOAD=3b010,READY=3b100state;/one-hot编码enumWAIT=3b001,LOAD=3b010,READY=3b100state;/基类宽度与赋给标签的值宽度不同enumlogicA,B,Clist4;/标签数超过基类所能代表的宽度enumlogicON=1b0,OFF=1bzswitch;enumlogic1:0WAIT,ERR=2bxx,LOAD,READYstate;/?,4.2枚举数据类型,枚举类型操作的强类型检验:枚举类型与其它的Verilog变量不同,它是强类型,一个枚举类型只可以进行下列赋值。枚举类型列表中的一个标签同类枚举类型的其它变量通过$cast转换成枚举类型变量的数值,typedefenumWAIT,LOAD,READYstates_t;states_tstate,next_state;intfoo;foo=state+1;state=next_state;state=WAIT;state=foo+1;state=state+1;state+;next_state+=state;,4.2枚举数据类型,将表达式强制转换为枚举类型:使用转换操作符和动态$cast系统函数。,typedefenumWAIT,LOAD,READYstates_t;states_tstate,next_state;next_state=states_t(state+1);$cast(next_state,state+1);,如果state=READY呢?会发生什么事?,4.2枚举数据类型,枚举类型的专用系统任务:SystemVerilog提供了一些内置函数,可以循环访问枚举类型列表中的值,这些方法能自动处理枚举类型的半强类型特性,简化操作。,.first返回枚举列表第一个成员的值.last返回枚举列表最后一个成员的值.next()返回枚举列表中下一个成员的值,可以用一个整数作为next的参数,这种情况返回后面第N个成员的值.prev()返回枚举列表中前一个成员的值.num返回枚举列表中元素个数.name返回枚举变量值对应的字符串,如果这个值不在枚举变量列表中,则返回一个空字符串,4.2枚举数据类型,modulecounter(inputlogicsynced,compare,resetN,clk,outputlogicin_sync);enumcnt0:15state,next_st;always_ff(posedgeclk,negedgeresetN)if(!resetN)state=cnt0;elsestate=next_st;always_ff(posedgeclk,negedgeresetN)if(!resetN)in_sync=0;elsebeginif(state=cnt8)in_sync=1;if(state=cnt0)in_sync=0;end,一个计数器的例子:输出in_sync初始为0,当计数器到8时置位,计数器到0清零;如果compare和synced均为假,计数器保持当前值;如果compare和synced均为真,计数器加1;如果compare为真而synced为假,计数器减2。,4.2枚举数据类型,always_combbeginnext_st=state;case(state)cnt0:if(compareendendcaseendendmodule,4.2枚举数据类型,打印枚举类型:枚举类型值可以作为标签的内部值或标签名打印。moduleFSM(inputlogicclk,resetN,outputlogic3:0control);enumlogic2:0WAIT=3b001,LOAD=3b010,READY=3b100state,next;always(posedgeclk,negeditresetN)if(!resetN)state=WAIT;elsestate=next;always_combbegin$display(“nCurrentstateis%s(%b)”,state.name,state);case(state)WAIT:next=LOAD;LOAD:next=READY;READY:next=WAIT;endcase$display(“nextstatewillbe%s(%b)”,next.name,next);endassigncontrol=state;endmodule,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!