版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SystemVerilog讲座
第一讲:SystemVerilog基本知识2008systemVerilog快速入门
VerilogHDL的发展历史
1984:GatewayDesignAutomation推出Verilog初版1989:Gateway被CadenceDesignSystems公司收购1990:Cadence向业界公开VerilogHDL标准1993:OVI提升theVerilog标准,但没有被普遍接受1995:IEEE推出VerilogHDL(IEEE1364-1995)标准2001:IEEE推出VerilogIEEEStd1364-2001标准2002:IEEE推出VerilogIEEEStd1364.1-2002标准2002:Accellera对SystemVerilog3.0进行标准化
–Accellera是OVI&VHDLInternational(VI)合并后的国际标准化组织2003:Accellera标准化后的SystemVerilog3.12006:IEEE推出带SystemVerilog扩展的Verilog新标准systemVerilog快速入门为什么称SystemVerilog
3.x?
SystemVerilog是对Verilog革命性的扩展
Verilog1.0-IEEE1364-1995“Verilog-1995”标准
–第一代IEEEVerilog标准
Verilog2.0-IEEE1364-2001“Verilog-2001”标准
–第二代IEEEVerilog标准
–显著提升了Verilog-1995标准的性能
SystemVerilog3.x-国际标准化组织对Verilog-2001的扩展
–第三代Verilog标准
–DAC-2002-SystemVerilog3.0–DAC-2003-SystemVerilog3.1systemVerilog快速入门SystemVerilog
是Verilog-2001扩展后的超集
assertionsmailboxestestprogramblockssemaphoresclockingdomainsconstrainedrandomvaluesprocesscontroldirectCfunctioncalls-----------------------SystemVerilog------------------------------------fromC/C++--------
classesdynamicarraysinheritanceassociativearraysstringsreferences
systemVerilog快速入门SystemVerilog
是Verilog-2001扩展后的超集
interfacesdynamicprocessesnestedhierarchy2-statemodelingbyteunrestrictedportspackedarraysimplicitportconnectionsarrayassignmentsenhancedliteralsenhancedeventcontroltimevalues&unitsunique/prioritycase/iflogic-specificprocessesrootnamespacealiasconst&=|=^=%=
------------------------------------------------------
--------fromC/C++--------intglobalsbreakshortintenumcontinuelonginttypedefreturnBytestructuresdo-whileShortrealunions++--+=-=*=/=voidcasting>>=<<=>>>=<<<=aliasconst&=|=^=%=-------------------------SystemVerilog-------------------------------systemVerilog快速入门SystemVerilog
是Verilog-2001扩展后的超集
ANSICstyleportsstandard(*attributes*)generate$value$plusargsconfigurationslocalparam`ifndef`elsif`linememorypartselectsconstantfunctions@*variablepartselect--------fromC/C++--------
multidimensionalarrayssignedtypesAutomatic**(poweroperator)----------------------------------Verilog-2001-------------------------------systemVerilog快速入门SystemVerilog
是Verilog-2001扩展后的超集
modules$finish$fopen$fcloseinitialwireregparameters$display$writedisableintegerrealfunction/task$monitoreventstimealways@`define`ifdef`elsewait#@packedarraysassign`include`timescalefork–join2Dmemory--------fromC/C++--------begin–end+=*/%whileforforever>><<if-elserepeat-------------------------Verilog-1995-------------------------------systemVerilog快速入门SystemVerilog
提高设计效率
SystemVerilogRTLRTLNetlist设计效率testbenchCo-simOverheadHDLSimultionSystemVerilogtestbench进行全面验证的环境断言验证硬件辅助的验证覆盖测试平台仿真形式化特性提高了验证的水平systemVerilog快速入门提高了设计效率描述同样的功能,其代码可缩短2到5倍
-代码短发生意外错误的概率减小了,但仍然可以综合,新的语句构造可以解决RTL仿真和综合后仿真的不匹配;
-小组成员间更容易理解和交流;缩短了学习周期。SystemVerilogRTLRTLNetlist设计效率结构化的和用户定义的数据类型与封装好的接口通信.*蕴涵的端口实例引用systemVerilog快速入门极大地提高了仿真速度
仅一种语言就能解决设计和测试问题设计和验证语言的统一提高了设计效率,学习周期很短,设计和验证人员都乐意采用:-可自动生成高级的受约束-随机测试信号语句,大大降低了设计和验证的复杂度;-完整的统一的断言技术改善了设计小组和验证小组之间的交流。testbenchCo-simOverheadHDLSimultionSystemVerilogtestbench使得我们有可能使用更高速度的仿真工具,加速了设计的完成systemVerilog快速入门SyestemVerilog的全面验证和设计统一的断言扩展了验证方法的效率-基于断言的验证-形式化特征的验证-线路板上的加速验证进行全面验证的环境断言验证硬件辅助的验证覆盖测试平台仿真形式化特性提高了验证的水平仿真检查硬件辅助验证SystemVerilog
断言自动测试平台覆盖测试形式化验证
综合抓住设计意图与每个设计和验证工程师联络学习周期短仿真检查硬件辅助验证systemVerilog快速入门SystemVerilog设计语言systemVerilog快速入门Verilog-2001的事件调度
当前的时隙
#0阻塞赋值
计算非阻塞表达式的RHS
连续赋值$display命令
更新非阻塞表达式的LHS
阻塞赋值
更新原语的输入和的输出,
$monitor系统命令
$strobe系统命令
语句激活
语句暂停活动
非阻塞赋值
监视来自上一个时隙Verilog-2001时隙被分成4等级区域新的名称将”延迟”事件区域去下一个时隙如何才能简化这个队列?指导原则No.8:不要用#0延迟systemVerilog快速入门编写代码的八项原则一般情况下,编写代码时如能按照以下8条原则就可以避免90%-100%由Verilog代码引起的冒险竞争现象:1)时序逻辑----使用非阻塞赋值2)锁存器----使用非阻塞赋值3)用always块生成的组合逻辑----用阻塞赋值4)在同一个always块中既有时序逻辑又有组合逻辑---
用非阻塞赋值5)在同一个always块中不要既用阻塞赋值又用非阻塞赋值6)不要在一个以上的always块中对同一个变量赋值7)用$strobe显示用非阻塞赋值指定的变量值8)不要用#0过程性赋值以上8条原则与Verilog-1995完全一致,仍旧适用于SystemVerilogsystemVerilog快速入门SystemVerilog的基本数据类型SystemVerilog可以定义:4态数据类型:0,1,X,Z2态数据类型:0,1未初始化的变量=X未初始化的线网=Z与Verilog-2001相同未初始化的变量=0未初始化的线网*=0SystemVerilog新添加的regr;//4态,Verilog-2001(位宽可变)数据类型integeri;//4态,Verilog-2001(32位)有符号数据类型logicw;//4态,(位宽可变)0,1,x,或者zbitb;//2态,(位宽可变)1位0或1byteb8;//2态,(8位)有符号整型数shortints;//2态,(16位)有符号整型数inti;//2态,(32位)有符号整型数longintl;//2态,(64位)有符号整型数[注]:*-bit类型既可以用于变量也可以用于线网。另外还加入了其他一些数据类型SystemVerilog新添加的数据类型reg[15:0]r16;logic[15:0]w16;bit[15:0]b16;reg,logic和bit数据类型位宽可以改变systemVerilog快速入门几乎通用的数据类型—logic
(等价于原来的
reg类型)logic类型类似于VHDL中的std_ulogic类型-对应的具体元件待定-只允许使用一个驱动源,或者来自于一个或者多个过程块的过程赋值对同一变量既进行连续赋值又进行过程赋值是非法的,不允许的。-在SystemVerilog中:logic和reg类型是一致的(类似于Verilog中wire和tri类型是一致的)wire数据类型仍旧有用因为:-多驱动源总线:如多路总线交换器(buscrossbars&onehotmuxes)-双向总线(两个驱动源)logic是4态数据类型的变量bit相当于2态数据类型的变量或线网systemVerilog快速入门用户定义的类型---typedef允许生成用户定义的或者容易改变的类型定义:好的命名规则用“_t”做后缀
typedefexisting_typemytype_t;`ifdefSTATE2typedefbitbit_t;//2–state`elsetypedeflogicbit_t;//4–stateendifdefines.vhsystemVerilog快速入门设计策略:用各种typedefs只要用typedef就可以很容易地在4态和2态逻辑仿真之间切换以加快仿真速度`ifdefSTATE2typedefbitbit_t;//2–state`elsetypedeflogicbit_t;//4–stateendifdefines.vhmoduletb;bit_tq,d,clk,rst_n;dffu1(.q(q),.d(d),.clk(clk),.rst_n(rst_n));initialbegin//stimulusendendmoduletb.vmoduledff(outputbit_tq,inputbit_td,clk,rst_n);always@(posedgeclk),if(!rst_n)q<=0;elseq<=d;endmoduledff.vverilog_cmddefine.vhtb.vdff.vverilog_cmddefine.vhtb.vdff.v+define+STATE2确省,为4态逻辑值仿真只用2态逻辑值,仿真速度快systemVerilog快速入门已确定的和待确定的类型四态和两态设计策略用待确定类型是最容易的。功能相当于VHDL中的std_ulogic类型,很有效率与VHDL中的std_logic类型没有功能可比较的类型`ifdefSTATE2typedefbitbit_t//2-态`elsetypedeflogicbit_t;//4-态`endif
define.vh`ifdefSTATE2typedefbitbit_t//2-态
typedef???tri_t//2-态`elsetypedefregbit_t;//4-态
typedefwiretri_t;//4-态`endif
define.vh无多驱动器的2态类型
----也许下一个版本的SystemVerilog能得到修正没有容易的std_ulogic和std_logic之间切换的等价语句
systemVerilog快速入门Verilog-2001
数据类型
(模块内部)模块的输入必须是线网类型的信号moduleA(out,in);outputout;inputin;regout;wirein;always@(in)out=in;endmodulemoduleB(out,in);outputout;inputin;wireout;wirein;assignout=in;endmodule用reg类型的输出(过程赋值语句的LHS必须用变量类型)
输出是线网类型的(用连续赋值驱动的变量类型)systemVerilog快速入门Verilog-2001
数据类型
(模块外部)信号由源驱动的必须定义为线网类型moduleA(out,in);
黑箱输出输入moduleB(out,in);
黑箱输出输入实例的输入往往由测试模块的变量驱动a2b输出信号必须定义为线网类型moduletest;regt_in;wirea2b;wiret_out;Au1(.out(a2b),.in(t_in));Bu2(.out(t_out),.in(a2b));initialt_in=1;t_outsystemVerilog快速入门Verilog-2001
数据类型
(模块内部、外部和测试放在一起)线网声明语句过程赋值语句的LHS必须用变量类型,通常是reg类型
这些都声明为线网类型moduleA(out,in);outputout;inputin;regout;wirein;always@(in)out=in;endmodulemoduleB(out,in);outputout;inputin;wireout;wirein;assignout=in;endmodulemoduletest;regt_in;wirea2b;wiret_out;Au1(.out(a2b),.in(t_in));Bu2(.out(t_out),.in(a2b));initialt_in=1;…….endmodulea2bt_out变量声明语句systemVerilog快速入门SystemVerilog—对端口定义没有限制
SystemVerilog允许过程或者连续赋值给变量赋值线网声明语句logic类型可以替代所有其他类型,包括reg类型
这些都声明为线网类型moduleA(out,in);outputout;inputin;logicout;logicin;always@(in)out=in;endmodulemoduleB(out,in);outputout;inputin;logicout;logicin;assignout=in;endmodulemoduletest;logict_in;logica2b;logict_out;Au1(.out(a2b),.in(t_in));Bu2(.out(t_out),.in(a2b));initialt_in=1;…….endmodulea2bt_out只有一个驱动源的变量都可以声明为logic类型systemVerilog快速入门SystemVerilog表示数字的语法有改进modulefsm_sv1b_3;……..always@*beginnext=`x;case(stat側Ů………endmodule类似VHDL的(Other=>…)语句进行“填满”的操作`x等于Verilog-2001的`bx`z等于Verilog-2001的`bz`1等于赋-1的值(即-1的2进制补码,也就是所有位赋为1)`0等于赋给0的值(也就是所有位赋为0)systemVerilog快速入门特定逻辑过程SystemVerilog有三个新的特定的逻辑过程来表达设计者的意图:always_combalways_latchalways_ffalways_combbegintmp1=a&b;tmp2=c&d;y=tmp1|tmp2;endalways_latchif(en)q<=d;always_ff@(posedgeclk,negedgerst_n)if(!rst_n)q<=0;elseq<=d;
允许仿真工具进行某些语法功能检查(lintingfunctionality)systemVerilog快速入门always_comb
特定逻辑过程always_comb-允许仿真工具检查正确的组合逻辑代码风格
正确的moduleao1(outputbit_ty,inputbit_ta,b,c,d);bit_ttmp1,tmp2;always_combbegintmp1=a&b;tmp2=c&d;y=tmp1|tmp2;endendmodulemoduleao1(outputbit_ty,inputbit_ten,d);always_combif(en)q<=0;endmodule
错误:想生成组合逻辑但产生了锁存器可能发生的错误信息:systemVerilog快速入门always_latch
特定逻辑过程always_latch-允许仿真工具检查正确的锁存器逻辑代码风格
正确的modulelat1(outputbit_tq,inputbit_ten,d);
always_latchif(en)q<=d;
endmodulemodulelat1(outputbit_tq,inputbit_ten,d);always_latchif(en)q<=d;elseq<=q;endmodule
错误:组合逻辑反馈环路不能生成锁存器可能发生的错误信息:systemVerilog快速入门always_ff
特定逻辑过程always_ff-允许仿真工具检查正确的寄存器逻辑代码风格
正确的moduledff1(outputbit_tq,inputbit_td,clk,rst_n);always_ff@(posedgeclk,negedgerst_n)if(!rst_n)q<=0;elseq<=d;endmodulemoduledff1(outputbit_tq,inputbit_td,clk,rst_n);always_ff@(clk,rst_n)if(!rst_n)q<=0;elseq<=q;endmodule
错误:非法敏感列表不能生成触发器可能发生的错误信息:systemVerilog快速入门always@*与always_comb
的差别它们之间的真正有什么差别,IEEEVSG和AccelleraSystemVerilog委员会还在辩论中,尚未最后确认modulefsm_svlb_3….always@*beginnext=‘x;case(state)…..end…..endmodulealways_comb对于函数内容的变化是敏感的
存在一些差别always_comb可用来检查非法锁存器always_comb在0时刻结束时自动触发一次@*可以写在always块内modulefsm_svlb_3….always_combbeginnext=‘x;case(state)…..end…..endmodulesystemVerilog快速入门Void函数没有返回值的函数不必从Verilog表达式中被调用
-Void函数可以象Verilog任务一样,独立地调用与Verilog任务不同,Void函数-不能等待-不能包括延迟-不能包括事件触发-被always_comb搜寻到的信号自动加入敏感列表systemVerilog快速入门always_comb与Void函数modulecomb1(outputbit_t[2:1]y,inputbit_ta,b,c);always_comborf1(a);functionvoidorf1;inputa;y[1]=a|b|C;endfunctionalways_combort1(a);
taskort1;inputa;y[2]=a|b|C;endtaskendmodule
always@*orf1(a);等价于:always@(a)等价于:always@(a,b,c)void函数的行为类似于0延迟的任务等价于:always@(a)Verilog任务b和c是隐含的输入always@*ort1(a);等价于:always@(a)b和c是隐含的输入-或者--或者-只有always_comb对函数的内容的变化是敏感的systemVerilog快速入门always_ff
用于双数据率(DDR)时序逻辑??
有可能提高未来综合工具的性能??
无正跳变沿触发时钟信号(clk)无负跳变沿触发时钟信号(clk)目前对综合器来说该语法是非法的moduleddrff(outputbit_tq,inputbit_td,clk,rst_n);always_ff@(clk,negedgerst_n)if(!rst_n)q<=0;elseq<=d;endmodule去掉正跳变沿是否可以允许用正负两个沿触发??always_ff显示设计者的意图这能综合成ASIC厂商库中的双数据率(DDR)时序逻辑吗??systemVerilog快速入门
设计意图—unique/priority
有优先的还是没有优先的?来回考虑综合时常容易产生的错误!
full_caseparallel_case看似“完全一样”的语句对应的实体是不同的这些指令告诉综合编译器,编写的设计代码有些地方和仿真器理解的有些不同综合前与综合后的仿真可能存在一些差别
unique和priority
这两个新添的指令告诉仿真器和综合器同一个信息
uniquecaseprioritycaseuniqueifpriorityif使得仿真器、综合器和形式化验证工具的行为变得一致systemVerilog快速入门
设计意图—priority
prioritycase:-full_case
full_case的仿真和综合所有的可能都已经定义了,任何其他的可能都是错误的prioritycase(1’b1)irq0:irq=4’b1<<0;irq1:irq=4’b1<<1;irq2:irq=4’b1<<2;irq3:irq=4’b1<<3;endcasepriorityif:-所有的分支被指定后不需要最后结束的elsepriorityif(irq0)irq=4’b1;elseif(irq1)irq=4’b2;elseif(irq2)irq=4’b4;elseif(irq3)irq=4’b8;prioritycase(1’b1)irq0:irq=4’b1<<0;irq1:irq=4’b1<<1;irq2:irq=4’b1<<2;irq3:irq=4’b1<<3;default:irq=0;endcasepriorityif(irq0)irq=4’b1;elseif(irq1)irq=4’b2;elseif(irq2)irq=4’b4;elseif(irq3)irq=4’b8;elseirq=4’b0;irq0到irq3中至少有一个必定为高否则仿真就出现运行错误default或最后的else语句使得priority关键字无效systemVerilog快速入门
设计意图—Unique
uniquecase:-full_case/parallel_case
full_case和parallel_case的仿真和综合所有的可能都已经定义了,任何其他的可能都是错误的uniquecase(1’b1)sel[0]:muxo=a;sel[1]:muxo=b;sel[2]:muxo=c;endcaseunique
if:
-full_case/parallel_caseunique
if(sel[0])muxo=a;elseif(sel[1])muxo=b;elseif(sel[2])muxo=c;ifsel==3‘b011仿真出现运行错误任何没有预料到的sel值将使仿真出现运行错误uniquecase(1’b1)sel[0]:muxo=a;sel[1]:muxo=b;sel[2]:muxo=c;default:muxo=‘x;endcaseunique
if(sel[0])muxo=a;elseif(sel[1])muxo=b;elseif(sel[2])muxo=c;elsemuxo=‘x;对没有预料到的sel值不会出现仿真运行错误unique仍旧测试覆盖的条件systemVerilog快速入门MooreFSM举例--状态图
FSM状态图未注明的地方输出:rd=0;ds=0;IDLEREADDONEDLYrd=1rd=1ds=1go=0go=1ws=1ws=0systemVerilog快速入门两个always块的编码风格
(符号、参数赋值—时序always块)modulesm2a(rd,ds,go,ws,clk,rstN);outputrd,ds;inputgo,ws,clk,rstN;parameterIDLE=2’b00,READ=2’b01,DLY=2’b10,DONE=2’b11;reg[1:0]state,next;always@(posedgeclkornegedgerstN)if(!rstN)state<=IDLE;elsestate<=next;Verilog没有枚举类型变量参数被用于有限状态机的设计systemVerilog快速入门两个always块的编码风格
(组合逻辑always块-连续赋值输出)always@(stateorgoorws)beginnext=2’bx;case(state)IDLE:if(go)next=READ;elsenext=IDLE;READ:next=DLY;DLY:if(!ws)next=DONE;elsenext=READ;DONE:next=IDLE;endcaseendassignrd=((state==read)||(state==DLY);assignds=(state==DONE);endmodule
仿真差错诀窍综合优化诀窍输出方法1(连续赋值)systemVerilog快速入门两个always块的编码风格
(组合逻辑always块-always阻塞赋值输出)…………always@(stateorgoorws)beginnext=2’bx;rd=1’b0;ds=1‘b0;case(state)IDLE:if(go)next=READ;elsenext=IDLE;READ:beginrd=1’b1;next=DLY;endDLY:beginrd=1’b1;if(!ws)next=DONE;elsenext=READ;endDONE:beginds=1’b1;next=IDLE;endendcaseendendmodule
初始化确省值的赋值初始化输出值到确省态输出方法2(always块赋值)systemVerilog快速入门枚举(enumerated)数据类型
(更高抽象层面的功能强大的数据类型)typedefenum{red,yellow,green,blue,white,black}clolors_t;clolors_tlight1,light2;initialbeginlight1=red;if(light1==red)light1=green;end
匿名的2态整型(int)变量enum{red,yellow,green}light1,light2;enum{bronze=3,silver,gold}medal;enum{a=0,b=7,c,d=8}alphabet;enum{bronze=4’h3,silver,gold}medal;silver=4,gold=5;silver=4’h4,gold=4’h5;语法错误(隐含)c=8,(明确)d=8;traffic_light=0(“red”)traffic_light=2(“green”)systemVerilog快速入门枚举类型的抽象
modulefsm_svla_3;….enum{IDLE,READ,DLY,DONE,XX}state,next;….endmodule
无指定值的抽象枚举名(值可以在以后指定)枚举变量state和next未注明的地方输出:rd=0;ds=0;IDLEREADDONEDLYrd=1rd=1ds=1go=0go=1ws=1ws=0逗号把括在{}内的枚举名分隔开来
枚举关键字systemVerilog快速入门枚举--赋整型值
modulefsm_svla_3;….enum{IDLE=3’b000,READ=3’b001,DLY=3’b010,DONE=3’b011,XX=3’b111}state,next;….endmodule
未指定数据类型,即假定数据为整型确省类型
用户对枚举名赋值systemVerilog快速入门
在FSM设计用3个always块
应用枚举
modulefsm_svla_3;
(outputregrd,ds,inputgo,ws,clk,rst_n);
enum{IDLE,READ,DLY,DONE,XX}state,next;always@(posedgeclk,negedgerst_n)if(!rst_n)state<=IDLE;elsestate<=next;always@*beginnext=xx;case(state)IDLE:if(go)next=READ;elsenext=IDLE;READ:next=DLY;DLY:if(!ws)next=DONE;elsenext=READ;DONE:next=IDLE;end….
枚举的测试和赋值………..always@(posedgeclk,negedgerst_n)if(!rst_n)beginrd<=1’b0;ds<=1’b0;endelsebeginrd<=1’b0;ds<=1’b0;case(next)READ:rd<=1’b1;DLY:rd<=1’b1;DONE:ds<=1’b1;endcaseendendmodule
逗号分开的敏感列表@*表示组合逻辑的敏感列表(简化的语法,减少RTL错误)抽象的枚举名systemVerilog快速入门枚举—指定四状态值
modulefsm_svlb_3;….enumreg[1:0]{IDLE=2’b00,READ=2’b01,DLY=2’b10,DONE=2’b11,XX=`x}state,next;….endmodule
x赋值在仿真无关项优化综合和调试时非常有用指定4态数据类型允许数据值为x或者zsystemVerilog快速入门在FSM设计用3个always块
应用赋值枚举
modulefsm_svla_3;
(outputregrd,ds,inputgo,ws,clk,rst_n);enumreg[1:0]{IDLE=2’b00,READ=2’b01,DLY=2’b10,DONE=2’b11,XX=‘x}state,next;always@(posedgeclk,negedgerst_n)if(!rst_n)state<=IDLE;elsestate<=next;always@*beginnext=xx;case(state)IDLE:if(go)next=READ;elsenext=IDLE;READ:next=DLY;DLY:if(!ws)next=DONE;elsenext=READ;DONE:next=IDLE;end….………..always@(posedgeclk,negedgerst_n)if(!rst_n)beginrd<=1’b0;ds<=1’b0;endelsebeginrd<=1’b0;ds<=1’b0;case(next)READ:rd<=1’b1;DLY:rd<=1’b1;DONE:ds<=1’b1;endcaseendendmodule
从抽象到具体需要做的唯一修改就是在枚举定义处赋值赋值的枚举值systemVerilog快速入门在FSM设计用3个always块
SystemVerilog3.0-应用赋值枚举
modulefsm_svla_3;
(outputregrd,ds,inputgo,ws,clk,rst_n);enumreg[1:0]{IDLE=2’b00,READ=2’b01,DLY=2’b10,DONE=2’b11,XX=‘x}state,next;always_ff@(posedgeclk,negedgerst_n)if(!rst_n)state<=IDLE;elsestate<=next;always_combbeginnext=xx;uniquecase(state)IDLE:if(go)next=READ;elsenext=IDLE;READ:next=DLY;DLY:if(!ws)next=DONE;elsenext=READ;DONE:next=IDLE;end….………..always@(posedgeclk,negedgerst_n)if(!rst_n)beginrd<=1’b0;ds<=1’b0;endelsebeginrd<=1’b0;ds<=1’b0;case(next)READ:rd<=1’b1;DLY:rd<=1’b1;DONE:ds<=1’b1;endcaseendendmodule
无论对仿真器和综合器以及形式化验证工具都相当于full_caseparallel_case允许更多的类似lint的代码检查systemVerilog快速入门在FSM设计用3个always块
SystemVerilog3.0-应用赋值枚举
enumreg[1:0]{IDLE=2’b00,READ=2’b01,DLY=2’b10,DONE=2’b11,XX=‘x}state,next;加入四状态变量的枚举类型,允许合法状态赋值和x状态赋值以未定义的抽象状态开始enum{IDLE,READ,DLY,DONE,XX}state,next;有利于抽象有利于观察波形有利于调试和综合systemVerilog快速入门枚举类型–波形显示
enumreg[1:0]{IDLE=2’b00,READ=2’b01,DLY=2’b10,DONE=2’b11,XX=‘x}state,next;确切标准的波形显示能力正在定义中比Verilog的$monitor系统任务容易编写代码显示枚举名还是ASCII字符??显示2进制数字??IDLE
READ
READ
DLY
DONE
IDLE
00
01
10
01
11
00
systemVerilog快速入门循环语句的性能得到增强modulefor4a(outputreg[31:0]y,input[31:0]a,inputs);integeri;always@(aors)for(i=0;i<32;i=i+1)if(!s)y[i]=a[i];elsey[i]=a[31-i];endmodulemodulefor4b(outputlogic[31:0]y,input[31:0]a,inputs);always@(aors)for(inti=0;i<32;i++)if(!s)y[i]=a[i];elsey[i]=a[31-i];endmodule独立的迭代变量声明本地迭代变量声明自动递加本地迭代变量是自动变量退出循环后就不再存在Verilog-2001SystemVerilog显式的递加a[31:0]a[0:31]a[31:0]i1i0syy[31:0]sSystemVerilog还增加了一个do-while循环(底测试循环)systemVerilog快速入门隐含的端口连接Verilog和VHDL都能用按端口名连接或按顺序连接的方式引用实例模块SystemVerilog用了两个新的隐含端口连接解决了顶层代码编写时表示端口连接代码的冗长
-.name端口连接
-.*隐含的端口连接大型ASIC顶层模块的端口连接非常麻烦而且冗长下面是一个中等大小模块的例子systemVerilog快速入门
中央算术逻辑单元(CALU)方块图
注意:所有寄存器的时钟端都由“clk”驱动,异步复位都由“rst_n”驱动MultOp1regshifter(0,1,4)MultOutregAccumulatorBarrelshifter(0-16)MUXALU(32bit)Multiplier16data16321616161616323232323232alu_outaccmultoutbsaccalu_inen_accalu_op[2:0]muxselld_multop1ld_multoutld_accld_shften_shftshft_lshftbs_lshft[4:0]ld_bsmop1mult32systemVerilog快速入门
中央算术逻辑单元(CALU)模块之一
modulecalu3(inout[15:0]data;input[4:0]bs_lshft;input[2:0]alu_op;input[1:0]shft_lshft;inputcalu_muxsel,en_shft,ld_acc,ld_bs;inputclk,rst_n);wire[31:0]acc,alu_in,alu_out,bs,mult,multout;wire[15:0]mop1;multop1multop1(.mop1,.data,.ld_multop1,.clk,.rst_n);multipliermultiplier(.mult,.mop1,.data);multoutregmultoutreg(.multout,.mult,.ld_multout,.clk,.rst_n);
MultOp1regMultOutregMultipliermultop1multop1(.mop1,.data,.ld_multop1,.clk,.rst_n);端口名的匹配只需要列出一次systemVerilog快速入门
中央算术逻辑单元(CALU)模块之二
……barrel_shifterbarrel_shifter(.bs,.data,.bs_lshft,.ld_bs,.clk,.rst_n);mult2mux(.y(alu_in),.i1(acc),.sel1(calu_muxsel));alualu(.aluout,.zero(),.neg(),.alu_in,.acc,.alu_op);accumulatoraccumulator(.acc,.alu_out,.ld_acc,.clk,.rst_n);shiftershifter(.data,.acc,.shft_lshft,.ld_shft,.en_shft,.clk,.rst_n);tribuftribuf(.data,.acc(acc[15:0]),en_acc);endmodule
具备所有按端口名连接的优点Barrelshifter(0-16)MUXALU(32bit)Accumulatorshifter(0,1,4)
代码更简练!!systemVerilog快速入门中央算术逻辑单元(CALU)顶层模块
用*表示隐含的端口modulecalu4(inout[15:0]data,input[4:0]bs_lshft,input[2:0]alu_op,input[1:0]shft_lshft,inputcalu_muxsel,en_shft,ld_acc,ld_bs,inputld_multop1,ld_multout,ls_shft,en_acc,inputclk,rst_n);wire[31:0]acc,alu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版龙门吊租赁及吊装作业风险分担协议3篇
- 二零二五年四人共同经营民宿的合伙协议书
- 二零二五年度出租车车辆租赁与智能驾驶技术研发合同3篇
- 二零二五年度展会现场搭建及展品运输合同3篇
- 2025年度高空作业安全防护施工合同范本4篇
- 二零二五年度城市绿化养护承包合同范本8篇
- 2025年度电动汽车充电桩安全检测与维护服务合同3篇
- 2025年新媒体营销活动合作协议范本2篇
- 2025年度泥瓦工劳务分包合同工期延误责任协议
- 2025版农业机械销售订购合同(年度版)3篇
- 2024年合肥市庐阳区中考二模英语试题含答案
- 质检中心制度汇编讨论版样本
- 药娘激素方案
- 提高静脉留置使用率品管圈课件
- GB/T 10739-2023纸、纸板和纸浆试样处理和试验的标准大气条件
- 《心态与思维模式》课件
- C语言程序设计(慕课版 第2版)PPT完整全套教学课件
- 行业会计比较(第三版)PPT完整全套教学课件
- 高考英语语法填空专项训练(含解析)
- 危险化学品企业安全生产标准化课件
- 《美的历程》导读课件
评论
0/150
提交评论