您好,欢迎访问三七文档
当前位置:首页 > 幼儿/小学教育 > 小学教育 > SystemVerilog硬件设计及建模第7-8-9章
HMECMicroElectronicsCenter新操作符改进的for循环新的do…while底部检测循环新的foreach循环第7章过程语句SystemVerilog增加了一些新的操作符和过程语句:更精确的RTL建模、更好地传达设计意图、保证软件工具按同样规则解释语句新的跳转语句增强的块命名语句标号唯一性与优先级判定HMECMicroElectronicsCenter7.1新操作符递增和递减操作符:++--赋值操作符:+=-=*=/=%=&=|=^======设置成员操作符:insideHMECMicroElectronicsCenter7.1.1递增递减操作符while(i++LIMIT)begin:loop1……//i最后的值为LIMITendwhile(++jLIMIT)begin:loop2……//j最后的值为LIMIT-1end语句操作描述j=i++后加i的值赋给j,然后i加1j=++i先加i加1,然后i的值赋给jj=i--后减i的值赋给j,然后i减1j=--i先减i减1,然后i的值赋给jHMECMicroElectronicsCenter7.1.1递增递减操作符竞争问题:++和--操作符是阻塞赋值,为避免竞争,递增递减操作符只能用于递增递减操作的变量不会被过程块外部语句读取的逻辑建模中!always_ff@(posedgeclock)if(!resetn)count=0;elsecount++;always_ff@(posedgeclock)case(state)HOLD:if(count==MAX)...always_ff@(posedgeclock)if(!resetn)count=0;elsecount=count+1;always_ff@(posedgeclock)case(state)HOLD:if(count==MAX)...HMECMicroElectronicsCenter7.1.2赋值操作符注意:这些赋值操作符是阻塞赋值,同样有竞争问题!!!操作符功能描述+=等号左边加上等号右边并赋值-=等号左边减去等号右边并赋值*=等号左边乘以等号右边并赋值/=等号左边除以等号右边并赋值%=等号左边除以等号右边,并将得到的余数赋值&=等号左边与等号右边进行位与操作并赋值|=等号左边与等号右边进行位或操作并赋值^=等号左边与等号右边进行位异或操作并赋值=将等号左边逻辑左移右边指定的位数并赋值=将等号左边逻辑右移右边指定的位数并赋值=将等号左边算术左移右边指定的位数并赋值=将等号左边算术右移右边指定的位数并赋值可综合性:i++;if(--i)sum=i++;可综合性:b+=5;b=(a+=5);HMECMicroElectronicsCenter7.1.2赋值操作符//example7-1:packagedefinitions;typedefenumlogic[2:0]{ADD,SUB,MULT,DIV,SL,SR}opcode_t;typedefenumlogic{UNSIGNED,SIGNED}operand_type_t;typedefunionpacked{logic[23:0]u_data;logicsigned[23:0]s_data;}data_t;typedefstructpacked{opcode_topc;operand_type_top_type;data_top_a;data_top_b;}instr_t;endpackageHMECMicroElectronicsCenter7.1.2赋值操作符importdefinitions::*;modulealu(inputinstr_tIW;outputdata_talu_out);always@(IW)beginif(IW.op_type==SIGNED)beginalu_out.s_data=IW.op_a.s_data;uniquecase(IW.opc)ADD:alu_out.s_data+=IW.op_b.s_data;SUB:alu_out.s_data-=IW.op_b.s_data;MULT:alu_out.s_data*=IW.op_b.s_data;DIV:alu_out.s_data/=IW.op_b.s_data;SL:alu_out.s_data=2;SR:alu_out.s_data=2;endcaseendelse...endendmodule//addtheomittedcontentsHMECMicroElectronicsCenter7.1.3有无关通配符的相等操作符无通配符逻辑相等:==(!=),条件相等:===(!==)SystemVerilog增加两个操作符:==?和!=?,在这种操作符中,右操作数中的逻辑位X或Z被看作通配符,它可以与左操作数中相应位的任何值相匹配!aba==ba===ba==?ba!=ba!==ba!=?b00000000真真真假假假00000101假假假真真真010Z0101未知假未知未知真未知010Z010Z未知真真未知假假010X010Z未知假真未知真假010X010X未知真真未知假假逻辑相等遇到Z或X,结果为未知,条件相等按位对0、1、X、Z进行精确匹配,左右两操作数完全相同,则结果为真,反之为假!HMECMicroElectronicsCenter7.1.3有无关通配符的相等操作符Verilog中,数字中的逻辑X可以用字符X或x表示,逻辑Z可以用字符z,Z或?表示,如:logic[7:0]opcode;...if(opcode==?8’b11011???)//屏蔽低三位如果两个操作数位数不同,通配相等操作符会在比较前将两向量扩展为相同长度,扩展规则与逻辑相等操作符一样。只有屏蔽位是常数表达式时通配符相等操作符才是可以综合的!!即右操作数不能是变量!logic[3:0]a,b;logicy1,y2;assigny1=(a==?4’b1??1);assigny2=(a==?b);HMECMicroElectronicsCenter7.1.4设置成员操作符—insideinside是检测一个变量或值是否是某一值集合中一员的操作符。logic[2:0]a;if(ainside{3’b001,3’b010,3’b100})//if((a==3’b001)||(a==3’b010)||(a==3’b100))if(datainside{bus1,bus2,bus3,bus4})//其它信号集intd_array[0:1023];if(13insided_array)//数组logic[2:0]a;if(ainside{3’b1?1})//通配符//与使用==?操作符一样HMECMicroElectronicsCenter7.2操作数改进Verilog的赋值转换:reg[63:0]a,y,temp;realr;temp=r**3;y=a+temp;类型强制转换:type’(表达式)longinta,y;realr;y=a+longint’(r**3);尺寸强制转换:size’(表达式)logic[15:0]a,b,c,sum;logiccarry;sum=a+16’(5);{carry,sum}=17’(a+3);sum=a+16’(b-2)/c;符号强制转换:signed’(表达式)unsigned’(表达式)HMECMicroElectronicsCenter7.3改进的for循环Verilog的for循环变量必须在循环体外部声明,SystemVerilog则可以在for语句中直接声明,但该循环变量为局部自动变量,如果要在块外或层次化引用,则必须象Verilog那样在块外说明。always_ff@(posedgeclock)beginfor(bit[4:0]i=0;i=15,i++)...end...for(inti=1,bytej=0;i*j128;i++,j+=3)HMECMicroElectronicsCenter7.4底部检测的do...while循环dobegindone=0;OutofBound=0;out=mem[addr];if(addr128||addr255)beginoutofBound=1;out=mem[128];endelseif(addr==128)done=1;addr-=1;endwhile(addr=128&&addr=255);与Verilog相比,SystemVerilog除有while循环外,还有至少执行一次的循环:do...while,该循环可以简化while循环代码量HMECMicroElectronicsCenteralways@*beginbegin:loopintegeri;first_bit=0;for(i=0;i=63;i=i+1)begin:passif(istart_range)disablepass;//继续循环if(iend_range)disableloop;//跳出循环if(data[i])beginfirst_bit=i;disableloop;//跳出循环endend//forend//loopend//alwaysVerilog采用disalbe实现跳转功能,SystemVerilog新增了Break,continue,return语句实现跳转。disable可以跳转到循环结尾继续下一次循环,也可以直接跳出整个循环,难以理解。7.5跳转语句HMECMicroElectronicsCenter//disable在任务所有语句执行完成前提前从任务中返回taskadd_up_to_mux(input[5:0]max,output[63:0]result);integeribeginresult=1;if(max==0)disableadd_up_to_mux;for(i=1;i=63;i=i+1)beginresult=result+result;if(i==max)disableadd_up_to_max;endendendtask7.5跳转语句HMECMicroElectronicsCentercontinue语句:logic[15:0]array[0:255];always_combbeginfor(inti=0;i=255;i++)begin:loopif(array[i]==0)continue;//下一itransform_function(array[i]);end//forend7.5跳转语句break语句:always_combbeginfirst_bit=0;for(inti=0;i=63;i++)begin:loopif(istart_range)continue;//下一iif(iend_range)break;//跳出循环if(data[i])beginfirst_bit=i;break;endend//forendHMECMicroElectronicsCenterreturn语句:taskadd_up_to_max(input[5:0]max,output[63:0]result);result=1;if(max==0)return;//退出任务for(inti=1;i=63;i=i+1;beginresult=result+result;if(i==max)return;endendtask7.5跳转语句在任务或空函数中,关键字return后面不能有表达式,而在非空函数中return后面一定要有表达式。HMECMicroElectronicsCenteralways_ff@(posedgeclock,posedgereset)begin:FSM_procedurelogicbreakVar;if(reset)begin:reset_logic…end:reset_logicels
本文标题:SystemVerilog硬件设计及建模第7-8-9章
链接地址:https://www.777doc.com/doc-3969495 .html