




已阅读5页,还剩119页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SystemVerilog讲座,第一讲:SystemVerilog基本知识,夏宇闻神州龙芯集成电路设计公司2008,1,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,always_ff(posedgeclk,negedgerst_n)if(!rst_n)q=0;elseq=d;,允许仿真工具进行某些语法功能检查(lintingfunctionality),25,always_comb特定逻辑过程,always_comb-允许仿真工具检查正确的组合逻辑代码风格,正确的,moduleao1(outputbit_ty,inputbit_ta,b,c,d);bit_ttmp1,tmp2;always_combbegintmp1=aendendmodule,moduleao1(outputbit_ty,inputbit_ten,d);always_combif(en)q=0;endmodule,错误:想生成组合逻辑但产生了锁存器,可能发生的错误信息:,26,always_latch特定逻辑过程,always_latch-允许仿真工具检查正确的锁存器逻辑代码风格,正确的,modulelat1(outputbit_tq,inputbit_ten,d);always_latchif(en)q=d;endmodule,modulelat1(outputbit_tq,inputbit_ten,d);always_latchif(en)q=d;elseq=q;endmodule,错误:组合逻辑反馈环路不能生成锁存器,可能发生的错误信息:,27,always_ff特定逻辑过程,always_ff-允许仿真工具检查正确的寄存器逻辑代码风格,正确的,moduledff1(outputbit_tq,inputbit_td,clk,rst_n);always_ff(posedgeclk,negedgerst_n)if(!rst_n)q=0;elseq=d;endmodule,moduledff1(outputbit_tq,inputbit_td,clk,rst_n);always_ff(clk,rst_n)if(!rst_n)q=0;elseq=q;endmodule,错误:非法敏感列表不能生成触发器,可能发生的错误信息:,28,always*与always_comb的差别,它们之间的真正有什么差别,IEEEVSG和AccelleraSystemVerilog委员会还在辩论中,尚未最后确认,modulefsm_svlb_3.always*beginnext=x;case(state).end.endmodule,always_comb对于函数内容的变化是敏感的,存在一些差别,always_comb可用来检查非法锁存器,always_comb在0时刻结束时自动触发一次,*可以写在always块内,modulefsm_svlb_3.always_combbeginnext=x;case(state).end.endmodule,29,Void函数,没有返回值的函数不必从Verilog表达式中被调用-Void函数可以象Verilog任务一样,独立地调用与Verilog任务不同,Void函数-不能等待-不能包括延迟-不能包括事件触发-被always_comb搜寻到的信号自动加入敏感列表,30,always_comb与Void函数,modulecomb1(outputbit_t2:1y,inputbit_ta,b,c);always_comborf1(a);functionvoidorf1;inputa;y1=a|b|C;endfunctionalways_combort1(a);taskort1;inputa;y2=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对函数的内容的变化是敏感的,31,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)时序逻辑吗?,32,设计意图unique/priority,有优先的还是没有优先的?来回考虑综合时常容易产生的错误!,full_caseparallel_case,看似“完全一样”的语句对应的实体是不同的,这些指令告诉综合编译器,编写的设计代码有些地方和仿真器理解的有些不同,综合前与综合后的仿真可能存在一些差别,unique和priority这两个新添的指令告诉仿真器和综合器同一个信息,uniquecaseprioritycaseuniqueifpriorityif,使得仿真器、综合器和形式化验证工具的行为变得一致,33,设计意图priority,prioritycase:-full_case,full_case的仿真和综合,所有的可能都已经定义了,任何其他的可能都是错误的,prioritycase(1b1)irq0:irq=4b10;irq1:irq=4b11;irq2:irq=4b12;irq3:irq=4b13;endcase,priorityif:-所有的分支被指定后不需要最后结束的else,priorityif(irq0)irq=4b1;elseif(irq1)irq=4b2;elseif(irq2)irq=4b4;elseif(irq3)irq=4b8;,prioritycase(1b1)irq0:irq=4b10;irq1:irq=4b11;irq2:irq=4b12;irq3:irq=4b13;default:irq=0;endcase,priorityif(irq0)irq=4b1;elseif(irq1)irq=4b2;elseif(irq2)irq=4b4;elseif(irq3)irq=4b8;elseirq=4b0;,irq0到irq3中至少有一个必定为高否则仿真就出现运行错误,default或最后的else语句使得priority关键字无效,34,设计意图Unique,uniquecase:-full_case/parallel_case,full_case和parallel_case的仿真和综合,所有的可能都已经定义了,任何其他的可能都是错误的,uniquecase(1b1)sel0:muxo=a;sel1:muxo=b;sel2:muxo=c;endcase,uniqueif:-full_case/parallel_case,uniqueif(sel0)muxo=a;elseif(sel1)muxo=b;elseif(sel2)muxo=c;,ifsel=3b011仿真出现运行错误,任何没有预料到的sel值将使仿真出现运行错误,uniquecase(1b1)sel0:muxo=a;sel1:muxo=b;sel2:muxo=c;default:muxo=x;endcase,uniqueif(sel0)muxo=a;elseif(sel1)muxo=b;elseif(sel2)muxo=c;elsemuxo=x;,对没有预料到的sel值不会出现仿真运行错误,unique仍旧测试覆盖的条件,35,MooreFSM举例-状态图,FSM状态图,36,两个always块的编码风格(符号、参数赋值时序always块),modulesm2a(rd,ds,go,ws,clk,rstN);outputrd,ds;inputgo,ws,clk,rstN;parameterIDLE=2b00,READ=2b01,DLY=2b10,DONE=2b11;reg1:0state,next;always(posedgeclkornegedgerstN)if(!rstN)state=IDLE;elsestate=next;,Verilog没有枚举类型变量,参数被用于有限状态机的设计,37,两个always块的编码风格(组合逻辑always块-连续赋值输出),always(stateorgoorws)beginnext=2bx;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(连续赋值),38,两个always块的编码风格(组合逻辑always块-always阻塞赋值输出),always(stateorgoorws)beginnext=2bx;rd=1b0;ds=1b0;case(state)IDLE:if(go)next=READ;elsenext=IDLE;READ:beginrd=1b1;next=DLY;endDLY:beginrd=1b1;if(!ws)next=DONE;elsenext=READ;endDONE:beginds=1b1;next=IDLE;endendcaseendendmodule,初始化确省值的赋值初始化输出值到确省态,输出方法2(always块赋值),39,枚举(enumerated)数据类型(更高抽象层面的功能强大的数据类型),typedefenumred,yellow,green,blue,white,blackclolors_t;clolors_tlight1,light2;initialbeginlight1=red;if(light1=red)light1=green;end,匿名的2态整型(int)变量,enumred,yellow,greenlight1,light2;,enumbronze=3,silver,goldmedal;,enuma=0,b=7,c,d=8alphabet;,enumbronze=4h3,silver,goldmedal;,silver=4,gold=5;,silver=4h4,gold=4h5;,语法错误(隐含)c=8,(明确)d=8;,traffic_light=0(“red”),traffic_light=2(“green”),40,枚举类型的抽象,modulefsm_svla_3;.enumIDLE,READ,DLY,DONE,XXstate,next;.endmodule,无指定值的抽象枚举名(值可以在以后指定),枚举变量state和next,逗号把括在内的枚举名分隔开来,枚举关键字,41,枚举-赋整型值,modulefsm_svla_3;.enumIDLE=3b000,READ=3b001,DLY=3b010,DONE=3b011,XX=3b111state,next;.endmodule,未指定数据类型,即假定数据为整型,确省类型,用户对枚举名赋值,42,在FSM设计用3个always块应用枚举,modulefsm_svla_3;(outputregrd,ds,inputgo,ws,clk,rst_n);enumIDLE,READ,DLY,DONE,XXstate,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=1b0;ds=1b0;endelsebeginrd=1b0;ds=1b0;case(next)READ:rd=1b1;DLY:rd=1b1;DONE:ds=1b1;endcaseendendmodule,逗号分开的敏感列表,*表示组合逻辑的敏感列表(简化的语法,减少RTL错误),抽象的枚举名,43,枚举指定四状态值,modulefsm_svlb_3;.enumreg1:0IDLE=2b00,READ=2b01,DLY=2b10,DONE=2b11,XX=xstate,next;.endmodule,x赋值在仿真无关项优化综合和调试时非常有用,指定4态数据类型允许数据值为x或者z,44,在FSM设计用3个always块应用赋值枚举,modulefsm_svla_3;(outputregrd,ds,inputgo,ws,clk,rst_n);enumreg1:0IDLE=2b00,READ=2b01,DLY=2b10,DONE=2b11,XX=xstate,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=1b0;ds=1b0;endelsebeginrd=1b0;ds=1b0;case(next)READ:rd=1b1;DLY:rd=1b1;DONE:ds=1b1;endcaseendendmodule,从抽象到具体需要做的唯一修改就是在枚举定义处赋值,赋值的枚举值,45,在FSM设计用3个always块SystemVerilog3.0-应用赋值枚举,modulefsm_svla_3;(outputregrd,ds,inputgo,ws,clk,rst_n);enumreg1:0IDLE=2b00,READ=2b01,DLY=2b10,DONE=2b11,XX=xstate,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=1b0;ds=1b0;endelsebeginrd=1b0;ds=1b0;case(next)READ:rd=1b1;DLY:rd=1b1;DONE:ds=1b1;endcaseendendmodule,无论对仿真器和综合器以及形式化验证工具都相当于full_caseparallel_case,允许更多的类似lint的代码检查,46,在FSM设计用3个always块SystemVerilog3.0-应用赋值枚举,enumreg1:0IDLE=2b00,READ=2b01,DLY=2b10,DONE=2b11,XX=xstate,next;,加入四状态变量的枚举类型,允许合法状态赋值和x状态赋值,以未定义的抽象状态开始,enumIDLE,READ,DLY,DONE,XXstate,next;,有利于抽象,有利于观察波形,有利于调试和综合,47,枚举类型波形显示,enumreg1:0IDLE=2b00,READ=2b01,DLY=2b10,DONE=2b11,XX=xstate,next;,确切标准的波形显示能力正在定义中,48,循环语句的性能得到增强,modulefor4a(outputreg31:0y,input31:0a,inputs);integeri;always(aors)for(i=0;i32;i=i+1)if(!s)yi=ai;elseyi=a31-i;endmodule,modulefor4b(outputlogic31:0y,input31:0a,inputs);always(aors)for(inti=0;i32;i+)if(!s)yi=ai;elseyi=a31-i;endmodule,独立的迭代变量声明,本地迭代变量声明,自动递加,本地迭代变量是自动变量退出循环后就不再存在,Verilog-2001,SystemVerilog,显式的递加,a31:0,a0:31,a31:0,i1,i0,s,y,y31:0,s,SystemVerilog还增加了一个do-while循环(底测试循环),49,隐含的端口连接,Verilog和VHDL都能用按端口名连接或按顺序连接的方式引用实例模块SystemVerilog用了两个新的隐含端口连接解决了顶层代码编写时表示端口连接代码的冗长-.name端口连接-.*隐含的端口连接,大型ASIC顶层模块的端口连接非常麻烦而且冗长,下面是一个中等大小模块的例子,50,中央算术逻辑单元(CALU)方块图,注意:所有寄存器的时钟端都由“clk”驱动,异步复位都由“rst_n”驱动,MultOp1reg,shifter(0,1,4),MultOutreg,Accumulator,Barrelshifter(0-16),MUX,ALU(32bit),Multiplier,16data,16,32,16,16,16,16,16,32,32,32,32,32,32,alu_out,acc,multout,bs,acc,alu_in,en_acc,alu_op2:0,muxsel,ld_multop1,ld_multout,ld_acc,ld_shft,en_shft,shft_lshft,bs_lshft4:0,ld_bs,mop1,mult,32,51,中央算术逻辑单元(CALU)模块之一,modulecalu3(inout15:0data;input4:0bs_lshft;input2:0alu_op;input1:0shft_lshft;inputcalu_muxsel,en_shft,ld_acc,ld_bs;inputclk,rst_n);wire31:0acc,alu_in,alu_out,bs,mult,multout;wire15:0mop1;multop1multop1(.mop1,.data,.ld_multop1,.clk,.rst_n);multipliermultiplier(.mult,.mop1,.data);multoutregmultoutreg(.multout,.mult,.ld_multout,.clk,.rst_n);,MultOp1reg,MultOutreg,Multiplier,multop1multop1(.mop1,.data,.ld_multop1,.clk,.rst_n);,端口名的匹配只需要列出一次,52,中央算术逻辑单元(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(acc15:0),en_acc);endmodule,具备所有按端口名连接的优点,Barrelshifter(0-16),MUX,ALU(32bit),Accumulator,shifter(0,1,4),代码更简练!,53,中央算术逻辑单元(CALU)顶层模块用*表示隐含的端口,modulecalu4(inout15:0data,input4:0bs_lshft,input2:0alu_op,input1:0shft_lshft,inputcalu_muxsel,en_shft,ld_acc,ld_bs,inputld_multop1,ld_multout,ls_shft,en_acc,inputclk,rst_n);wire31:0acc,alu_in,alu_out,bs,mult,multout;wire15:0mop1;multop1multtop1(.*);multipliermultiplier(.*);multoutregmultoutreg(.*);barrel_shifterbarrel_shifter(.*);mult2mux(.y(alu_in),.i0(multout),i1(acc),sell(calu_muxsel);alualu(.*,.zero(),.neg();accumulatoraccumulator(.*);shiftershifter(.*);tribuftribuf(.*,.acc(acc15:0);endmodule,本风格重点表达端口出现不同的地方,Barrelshifter(0-16),MUX,ALU(32bit),Accumulator,shifter(0,1,4),代码更简练,MultOutreg,MultOp1reg,54,隐含.name和.*端口连接的规则,在同一个实例引用中禁止混用.*和.name端口;允许在同一个实例引用中使用.name和.name(signal)连接;也允许在同一个实例引用中使用.*和.name(signal)的连接;必须用.name(signal)连接的情况:-位宽不匹配-名称不匹配-没有连接的端口,instu1(,.data(data7:0),.);,instu2(,.data(pdata),.);,instu3(,.berr(),.);,注意:比Verilog2001有更强大的端口连接描述,表述更简洁,55,CALU顶层模四种不同端口连接代码长度不同,56,隐含端口连接的缺点,moduledrivera(output7:0y,input7:0a,inputena);assigny=ena?a:8bz;endmodule,如果端口标识符相同很容易造成连接错误-出错后很难发现,moduledriverc(output7:0y,input7:0c,inputena);assigny=ena?c:8bz;endmodule,moduledriverd(output7:0y,input7:0c,inputena);assigny=ena?d:8bz;endmodule,moduledriverb(output7:0y,input7:0b,inputena);assigny=ena?b:8bz;endmodule,使能信号名ena都相同,想设计的逻辑,57,端口连接时用别名,moduledrivera(output7:0y1,input7:0a,inputena);,moduledriverc(output7:0y3,input7:0c,inputena);,moduledriverd(output7:0y4,input7:0c,inputena);,moduledriverb(output7:0y2,input7:0b,inputena);,新的SystemVerilog关键字alias,moduleena_decode(outputregena,enb,enc,ene,input1:0sel);.,moduleonehot_busmux(output7:0y,input7:0a,b,c,d,input1:0sel);wireena,enb,enc,ene;wire7:0y1,y2,y3,y4;aliasy=y1=y2=y3=y4;ena_decodeu0(.*);driverau1(.*);driverau2(.*,.ena(enb);driverau3(.*,.ena(enc);driverau4(.*,.ena(ene);endmodule,y,y1,y2,y3,y4都是别名连接在一起,用.*缩短了实例端口的连接,58,用.*隐含端口连接的优缺点,优点:编写顶层模块时容易多了扫描多达1000个端口的顶层设计更加容易比按照名字或者顺序连接端口的代码简洁多了。仍旧保留显式端口连接的优点编写用模块组装的顶层测试模块变得容易多了-使测试模块的信号与端口名一致,缺点:可能造成不想要的连接-很难发现错误-使模块的分别编译变得复杂-用户使用错误时工具会发生崩溃对低层结构性的网表没有什么用处-原语端口很少能与线网匹配,合法的工具开发者很害怕这一点,.*的端口连接把所有没有必要的麻烦都清除了,只列出端口连接的例外情况即可,所有端口都是隐含连接的,59,第二讲:,SystemVerilog提高了设计和验证的效率,60,设计和验证只需用同一种语言大大提高工作效率,容易学习-SystemVerilog语言本身很容易掌握改善了设计小组和验证小组之间的联络由于具备高级语言结构,因而减少了设计和验证工作的复杂性,61,打包的和未打包的数组,未打包的位数组,打包的位数组,1K16位未打包的存储器,1K16位打包的存储器,bita3:0;,bit3:0p;,bit15:0memory1023:0;initialbeginmemoryi=memoryi;memoryi15:8=0;end,bit1023:015:0vframe;always(vcmd)if(vcmd=INV)vfram=vframe;,打包的索引可以分块,可以对整个存储器进行操作,62,未打包的四维数组,对应这个语句最大的可访问单元为1位,logicxdata3:02:01:07:0,7:0,2:0,1:0,3:0,63,打包的一维数组和未打包的三维数组,对应这个语句最大的可访问单元为8位,logic7:0xdata3:02:01:0,7:0,2:0,1:0,3:0,64,打包的二维数组和未打包的二维数组,对应这个语句最大的可访问单元为16位,logic1:07:0xdata3:02:0,7:0,2:0,1:0,3:0,65,打包的四维数组,对应这个语句最大的可访问单元为192位,logic3:02:01:07:0xdata,7:0,2:0,1:0,3:0,66,数据的组织,reg47:0pktsrc_adr;reg47:0pktdst_adr;reg7:0InstOpCde;reg7:0InstOpRF127:0;,信号成组后有意义-指令:操作符和操作数-包的区域:地址、数据和纠错码Verilog只提供非正式分组,defineopcode31:16reg31:0Instruction;Instructionopcode,用名称,用矢量位置,67,数据的组织,目标:把数据组织得与高级编程语言一样-使其他人能非常清晰地理解设计中数据之间的关系;SystemVerilog增加了结构,联合和数组类型-能够分别使用这些类型,或者结合起来使用从而能更精确地描述设计的意图。,68,数据的组织,结构(Structs)保留了逻辑分组引用结构成员需要用比较长的表达式但代码的意义很容易理解,structaddr_tsrc_adr;addr_tdst_adr;data_tdata;pkt;initialbeginpkt.src_adr=src_adr;if(pkt.src_adr=node.adr);.end,把src_adr值赋给pkt结构中的src_adr区,把node结构中的adr区与pkt结构中的dst_adr区做比较,69,数据的组织打包的结构和打包的联合,未打包的结构(Struct)-保留了逻辑分组打包的结构(Struct)-保留了逻辑分组-方便了访问,typedeflogic7:0byte_t;typedefstructpackedlogic15:0opcode;logic7:0arg1;logic7:0arg2;cmd_t;typedefunionpackedbyte_t3:0bytes;cmd_tfields;instruction_u;instruction_ucmd;,打包的结构,打包的联合,cmd31:0,cmd.fields.opcode15:0,cmd.fields.arg17:0,cmd.fields.arg27:0,cmd_t的区域,cmd.byte1,cmd.byte0,cmd.byte2,cmd.byte3,70,数据的组织打包的结构和打包的联合,typedeflogic7:0byte_t;typedefstructpackedlogic15:0opcode;logic7:0arg1;logic7:0arg2;cmd_t;typedefunionpackedbyte_t3:0bytes;cmd_tfields;instruction_u;instruction_ucmd;,打包的联合使得我们能方便地用不同名称引用同一个数据,cmd现在等于32hDEADBEEF,initialbegincmd.fields.opcode=16hDEAD;cmd7:0=8hEF;cmd.bytes1=8hBE;,不需要测试数据类型,D,E,A,D,11101111,B,E,数据映射到所有成员,DEADBEEF,D,E,A,D,D,E,A,D,B,E,B,E,11101111,11101111,这是同一个打包的数据结构,71,第三讲SystemVerilog模块的接口,72,实例模块端口的连接,SystemVerilog的改进-用.name和.*来简化端口的连接-用接口实现SystemVerilog模块的连接-第一层-用接口实现SystemVerilog模块的连接-第二层可以用宏指令(include)包含:任务、函数、断言等对测试平台的开发非常重要:因为接口包含了合法的接口命令对IP的开发非常重要:因为接口可以报告出错,接口信息的封装,添加了传递测试平台和断言值所需要的端口,73,接口的功能,接口能传递穿越端口的记录数据类型有两种类型的接口元素:-声明的-作为参数可以直接传递进入模块接口可以是:-参数,常数和变量-函数和任务-断言,74,SystemVerilog的接口,白板上的设计,SystemVerilog的设计,总线,总线,总线,Verilog-2001风格的设计,复杂的信号连接在块中重复的总线协议通过层次很难添加信号,通信封装在接口中减少出错的机会容易修改显著缩短代码节省编写时间能建立高效交易模型允许自动化的块验证,接口总线sig1sig2read()write()Assert,75,接口是什么?,提供新层次结构-把内部连接和通信封装起来-把模块的通信功能从其他功能中分离出来-消除了接线引起的错误-RTL级别的抽象成为可能,inti;logic7:0a;interfaceintf;inti;logic7:0a;endinterface:intf,inti;logic7:0a;typedefstructinti;logic7:0a;s_type;,接口就是一束连接线,正象结构是一束变量一样,76,接口的引用变量和函数,接口变量可以用接口实例名加(.)变量名引用接口函数可以用接口实例名加(.)函数名引用通过接口的模块连接-能调用接口任务和函数的成员来驱动通信-抽象级和通信协议能容易地加以修改用一个包含相同成员的新接口来替换原来的接口,接口改变了但是被连接的模块并未改变,77,接口如何工作,interfaceintf;logica,b;logicc,d;logice,f;endinterface,moduletop;intfw();mod_am1();mod_bm2();endmodule,modulemod_a;endmodule,modulemod_b;endmodule,还未建立端口,实例化接口,接口类型声明,inft,mod_am1,mod_bm2,inftw,top,引用实例mod_a和mod_b,78,接口如何工作,interfaceintf;logica,b;logicc,d;logice,f;endinterface,moduletop;intfw();mod_am1();mod_bm2();endmodule,modulemod_a(intfi1);endmodule,modulemod_b(intfi2);endmodule,给mod_a和mod_b添加接口,mod_am1,mod_bm2,inftw,top,intfi1,intfi2,79,接口如何工作,interfaceintf;logica,b;logicc,d;logice,f;endinterface,moduletop;intfw();mod_am1(.i1(w);mod_bm2(.i2(w);endmodule,modulemod_a(intfi1);endmodule,modulemod_b(intfi2);endmodule,接口类似于跨骑在两个模块上的一个模块,mod_am1,mod_bm2,infti1-w-i2,top,接口实例w在mod_a中被称为i1,在mod_b中被称为i2,接口也能包含模块端口(模块端口将在以后讨论),80,接口的使用,interfaceintf;logica,b;logicc,d;logice,f;endinterface,moduletop;intfw();mod_am1(.i1(w);mod_bm2(.i2(w);endmodule,modulemod_a(intfi1);endmodule,modulemod_b(intfi2);endmodule,接口类型声明,mod_am1,mod_bm2,infti1-w-i2,top,接口实例引用,具体化的接口实例w在mod_a中被称为i1,在mod_b中被称为i2,引用定义的接口类型,被引用接口的本地访问名,81,接口的合法使用,interfaceintf;logica,b;logicc,d;logice,f;endinterface,moduletop;intfw();endmodule,接口类型声明,inftw,top,接口实例引用,声明并引用了接口实例,但并未访问过具体接口实例的线网和变量,这样做是合法的,但没有什么用处.,82,接口的非法使用,interfaceintf;logica,b;logicc,d;logice,f;endinterface,modulemod_a(intfi1);endmodule,modulemod_b(intfi2);endmodule,接口类型声明,mod_am1,mod_bm2,错误:1)声明了接口2)引用了接口3)但接口从未实例化过,引用了定义的接口类型,被引用接口的本地访问名,infti1,infti2,?,接口intf声明,83,简单的接口,interfaceblk_if;logic2:0s1;logics2;logics3;endinterface,modulem1;blk_ifa;assigny=endmodule,模块端口括号中列出的接口b引用了接口实例中声明的线网和变量,在模块内引用了接口实例,声明了一组线网和变量,a.s12a.s11a.s10a.s2a.s3,modulem2(blk_ifb);assigny=endmodule,b.s12b.s11b.s10b.s2b.s3,84,带端口的简单接口,interfaceblk_if(inputbitclk);logic2:0s1;logics2;logics3;endinterface,这个blk_if接口a有一个隐含的时钟输入,85,带模块端口的简单接口,interfaceblk_if(inputbitclk);logic2:0s1;logics2;logics3;logicq;modports(inputclk,s1,s2,outputq);endinterface,moduletb;bitclk;blk_ifb_if(.clk);m4u1(.a(b_if);b_if.s12b_if.s11b_if.s10b_if.s2b_if.s3always#10clk=clk;endmodule,modulem4(blk_if.sa);always(posedgea.clk)a.q=a.s10;endmodule,a.s12a.s11a.s10a.s2a.s3,(inputclk),a.clk,u1引用实例模块m4,u1.a.q=b_if.q,modportsinput,Modport定义了模块接口s,其中s1,s2为输入,q为输出,a.q,86,与接口一起工作-tb的任务,interfaceblk_if(inputbitclk);logic2:0s1;logics2;logics3;logicq;modportd(inputclk,s2,outputq);endinterface,moduletb;bitclk;blk_ifb_if(.clk);m5u1(.a(b_if);initialbeginwrite(1b1);endtaskwrite(inputval)(negedgeclk)b_if.s2=val;endtaskendmodule,modulem5(blk_if.da);always(posedgea.clk)a.q=a.s2;endmodule,a.s2,a.clk,u1引用实例模块m5,u1.a.q=b_if.q,modportd的输入,Modport定义了模块接口d,其中s1,s2为输入,q为输出,a.q,b_if.s2,modportd的输出,87,接口任务,moduletb;bitclk;blk_if2b_if(.clk);m5u1(.a(b_if);initialbeginb_if.write(1b1);endmodule,modulem5(blk_if2.da);always(posedgea.clk)a.q=a.s2;endmodule,a.s2,a.clk,u1引用实例模块m5,u1.a.q=b_if.q,把测试模块中的任务放在接口中定义,a.q,b_if.s2,从接口调用写任务,interfaceblk_if2(inputbitclk);logic2:0s1;logics2;logics3;logicq;modportd(inputclk,s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 炼钢原料工协作考核试卷及答案
- 解析卷云南省宣威市7年级上册期中测试卷单元测试试卷(详解版)
- 卫星数据服务平台创新创业项目商业计划书
- 美妆护肤指南创新创业项目商业计划书
- 园林绿化作业人员测试卷附答案详解【研优卷】
- 基础强化人教版(五四制)6年级数学下册期末试卷(突破训练)附答案详解
- 热风炉工标准化作业考核试卷及答案
- 推拿治疗学试题带答案详解(考试直接用)
- 汽车回收工设备维护与保养考核试卷及答案
- 多工序数控机床操作调整工协作考核试卷及答案
- 生活中的会计课件
- 辽宁大学学生手册
- CorelDRAW教学讲解课件
- 湘美版美术一年级上册全册课件
- 酒水购销合同范本(3篇)
- 师说一等奖优秀课件师说优质课一等奖
- 学习罗阳青年队故事PPT在急难险重任务中携手拼搏奉献PPT课件(带内容)
- 小学生打扫卫生值日表word模板
- 新水浒q传乡试会试测验题目
- 小学一年级开学第一课
- 地基承载力计算
评论
0/150
提交评论