您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 综合/其它 > SystemVerilog硬件设计及建模—第34章
HMECMicroElectronicsCenter增强的文本值改进的`define文本替换时间值新的变量类型有符号和无符号类型静态和动态变量类型转换常数第3章SystemVerilog文本值和数据类型HMECMicroElectronicsCenter3.1增强的文本赋值Verilog中的向量赋值:parameterSIZE=64;reg[SIZE–1:0]data;data=0;//将数据各位置0data=‘bz;//将数据各位置zdata=‘bx;//将数据各位置x但如何给data赋全1的值??data=64’hFFFFFFFFFFFFFFFF;//不可扩展,如果//SIZE改为128呢?data=~0;//1的补码data=-1;//2的补码HMECMicroElectronicsCenter3.1增强的文本赋值SystemVerilog在向量赋值的增强:1.可以只指定要赋的值,不用指定进制2.赋值可以是逻辑1,该语法指定所有位所赋的值parameterSIZE=64;reg[SIZE–1:0]data;data=‘0;//将数据各位置0data=‘1;data=‘z;//将数据各位置zdata=‘x;//将数据各位置xHMECMicroElectronicsCenter3.2`define增强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);HMECMicroElectronicsCenter3.2`define增强SystemVerilog允许在包含变量替换的宏文本字符串中使用隔离引号,SV中如何通过宏定义实现下面与Verilog相同功能的语句?$display(“variable\”data\”=%h”,data);`defineprint(v)$display(`“variable`\`”v`\`”=%h`”,v)`print(data);$display(“variable\”data\”=%h”,data);HMECMicroElectronicsCenter3.2`define增强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);HMECMicroElectronicsCenter3.3SystemVerilog变量对象类型和数据类型SystemVerilog四态变量SystemVerilog两态变量显式及隐式变量和线网类型综合指导HMECMicroElectronicsCenter3.3.1对象类型和数据类型对象类型指明信号是变量还是线网;数据类型指明变量或线网的值系统:两态数据类型或四态数据类型Verilog数据类型:变量:integer,reg,time线网:wire,wor,wandSystemVerilog数据类型:1.包含了所有的Verilog数据类型2.增加了一些新数据类型:byte,int,logicHMECMicroElectronicsCenter3.3.2SystemVerilog四态变量SystemVerilog用logic关键字描述通用的针对硬件的数据类型,logic数据类型变量与Verilog中的reg类型是大多数情况下可以互换使用logic类型变量声明:logicresetN;//一位四态变量logic[63:0]data;//64位宽变量logic[0:7]array[0:255];//8位数组变量显式变量或线网声明:varlogic[63:0]addr;//64位宽变量wirelogic[63:0]addr;//64位宽线网Whylogic?HMECMicroElectronicsCenter3.3.3SystemVerilog两态变量适合于更高抽象层次建模,如系统级和交易级bit—1位两态整数byte—8位两态整数,与C语言的char类似shortint—16位两态整数,与C语言的short类似int—32位两态整数,与C语言的int类似longint—64位两态整数,与C语言的long类似bitresetN;bit[63:0]data;bit[0:7]array[0:255];varbit[63:0]addr;HMECMicroElectronicsCenter3.3.3SystemVerilog两态变量类似C语言类型优点:1.类似C语言的两态类型如int和byte,主要用来描述更抽象的总线功能模型,不需要描述硬件细节,如三态总线及可能产生逻辑值X的硬件冲突2.易于使用SystemVerilog的直接编程接口(DPI),建立Verilog到C或C++的接口,因为数据类型相同,所以数据在两语言间的传递更简单有效3.for语句中的循环变量,综合后就消失了,int类型是一个很好的选择HMECMicroElectronicsCenter3.3.4显式及隐式变量和线网类型声明语句中,数据类型前没有显式指定对象类型时,则推断为隐式变量logic[7:0]busA;bit[31:0]busB;varlogic[7:0];varbit[31:0]b;typedefenumbit{FALSE,TRUE}bool_t;varbool_tc;var[7:0]d;//四态8位变量wire[31:0]busB;//隐含为四态逻辑数据类型wirelogic[31:0]busC;1.两态线网问题2.wirereg[31:0]busD;HMECMicroElectronicsCenter3.4RTL中使用两态类型SystemVerilog新增加的两态类型可以用于设计抽象建模,这种情况下很少用到三态值,可能导致不确定值或不可预测值(X)的电路不会出现。SystemVerilog允许给一个两态类型赋四态值,其映射关系如下:四态值转换为0011Z0X0HMECMicroElectronicsCenter3.4.1两态类型和四态类型仿真1.两态模式仿真器:软件工具在设计模型不需要使用逻辑Z和X时提供的仿真模式,提高仿真速度2.多数两态模式仿真器通常不能使用两态与四态混合仿真3.不同两态模式仿真器将Z和X映射到两态类型时可能不同,导致仿真结果不同4.两态仿真模式对casez和casex解释不同,从而导致仿真结果不同5.SystemVerilog中标准两态类型为所有软件工具提供相同的行为,同时,四态到两态的映射也是标准化的,因此所有软件工具仿真结果也是一致的HMECMicroElectronicsCenter3.4.2case语句中使用两态类型缺省赋值两个优点:其一是综合会将条件选择项的译码逻辑进行优化,不会考虑缺省分支条件表达的值如何译码;其二是缺省X赋值有助于检测RTL模型中的设计错误case(state)RESET:next=WAIT;WAIT:next=LOAD;LOAD:next=DONE;DONE:next=WAIT;default:next=4’bx;//不定态endcase但如果是两态变量呢?!……给两态变量赋一个X值如何?HMECMicroElectronicsCenter3.5数据类型规则的放宽SystemVerilog简化了模型中数据类型的使用,任何数据类型的变量都可以通过下列方式赋值:initial或always过程块中赋值在单个always_comb,always_ff或always_latch过程块中赋值通过单个模块或原语的output/inout端口驱动赋值大部分信号可以声明为变量类型!!!HMECMicroElectronicsCenter3.5数据类型规则的放宽modulecompare(outputlogiclt,eq,gt,inputlogic[63:0]a,b);always@(a,b)if(ab)lt=1’b1;//过程赋值elselt=1’b0;assigngt=(ab);//连续赋值comparatoru1(eq,a,b);//模块例化endmodulemodulecomparator(outputlogiceq,inputlogic[63:0]a,b);always@(a,b)eq=(a==b);endmoduleHMECMicroElectronicsCenter3.5数据类型规则的放宽对变量使用的限制可以防止设计错误:多个输出端口驱动一个变量;对一个变量进行多次连续赋值;对同一个变量同时进行过程赋值和连续赋值moduleadd_and_increment(outputlogic[63:0]sum,outputlogiccarry,inputlogic[63:0]a,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,….endmoduleHMECMicroElectronicsCenter3.6有符号和无符号修饰符integerj;//verilog-1995标准,32位有符号数reg[63:0]u;//无符号64位数regsigned[63:0]s;//有符号64位数,verilog-2001标准SystemVerilog增加了缺省为有符号数的数据类型:byte,shortint,int和longintints_int;//有符号32位变量intunsignedu_int;//无符号32位变量与verilog相同,SystemVerilog只能在类型关键字后面指定signed或unsigned关键字,与C语言不同!HMECMicroElectronicsCenter3.7静态变量和自动变量verilog-1995标准中,所有数据类型都是静态的verilog-2001标准中在任务和函数中添加了自动变量自动变量特点是其存储区在需要时由软件工具动态分配,不需要时被释放,因此也被称为动态变量。自动变量用途:1.用于描述在测试程序、抽象系统级、交易级或总线功能模型中的验证程序2.用于编写可重入任务或递归函数HMECMicroElectronicsCenter3.7静态变量和自动变量平衡加法器:把数组的所有元素加在一起,被加的数组元素高、低地址作为函数的输入。functionautomaticintb_add(intlo,hi);intmid=(lo+hi+1)1;if(lo+1!=hi)return(b_add(lo,(mid–1))+b_add(mid,hi));elsereturn(array[lo]+array[hi]);en
本文标题:SystemVerilog硬件设计及建模—第34章
链接地址:https://www.777doc.com/doc-5483750 .html