收藏 分销(赏)

Verilog的可综合描述风格.ppt

上传人:pc****0 文档编号:13112141 上传时间:2026-01-20 格式:PPT 页数:39 大小:142.50KB 下载积分:10 金币
下载 相关 举报
Verilog的可综合描述风格.ppt_第1页
第1页 / 共39页
Verilog的可综合描述风格.ppt_第2页
第2页 / 共39页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,Verilog,的可综合描述风格,学习目标:,学习组合逻辑和时序逻辑的可综合的描述风格及技术,包括:,不支持的,Verilog,结构,过程块,寄存器,敏感列表,持续赋值,综合指导,条件结构,阻塞及非阻塞赋值,锁存器,/MUX,推断,函数,function,任务,task,复位,有限状态机,FSM,宏库及设计复用,描述风格简介,如果逻辑输出在任何时候都直接由当前输入组合决定,则为,组合逻辑,。,如果逻辑暗示存储则为,时序逻辑,。如果输出在任何给定时刻不能由输入的状态决定,则暗示存储。,通常综合输出不会只是一个纯组合或纯时序逻辑。,一定要清楚所写的源代码会产生什么类型输出,,并能够反过来确定为什么所用的综合工具产生这个输出,,这是非常重要的。,不支持的,Verilog,结构,综合工具通常不支持下列,Verilog,结构,:,initial,循环,:,repeat,forever,while,非结构化的,for,语句,数据类型,:,event,real,time,UDP,forkjoin,块,wait,过程持续赋值:,assign,deassign,force release,操作符:,=,!=,过程块,任意边沿,在所有输入信号的任意边沿进入的过程块产生组合逻辑。这种过程块称为组合块。,always(a or b)/,与门,y=a,单个边,沿,在一个控制信号的单一边沿上进入的过程块产生同步逻辑。这种过程块称为同步块。,always(,posedge,clk,)/D flip-flop,q =d;,同步块也可以对异步复位信号的变化产生敏感,always(,posedge,clk,or,negedge,rst,_),if(!,rst,_)q=0;,else q=d;,过程块中的寄存器类型,若同步块中使用一个,reg,,,则:,如果在一个时钟周期赋值并在另一个周期被采样,则只能以硬件寄存器实现。,如果,reg,还是一个基本输出,它会出现在综合网表中,但不一定是一个硬件寄存器。,若两者都不是,该信号可能被优化掉。,若组合块中使用一个,reg,,,则:,如果,reg,值随块的任何一个输入的变化而改变,则在综合时不会产生硬件寄存器。,如果,reg,值并不总是随块的输入变化而改变,则综合时会产生一个锁存器。,同步寄存器举例,在这个例子中,,rega,只作暂存,因此会被优化掉。,module ex1reg(d,clk,q);,input d,clk,;,output q;,reg,q,rega,;,always(,posedge,clk,),begin,rega,=0;,if(d),rega,=1;,q=,rega,;,end,endmodule,在这个例子中,,rega,产生一个寄存器,不会被优化掉。,module ex2reg(d,clk,q);,input d,clk,;,output q;,reg,q,rega,;,always(,posedge,clk,),begin,rega,=0;,if(d),rega,=1;,end,always(,posedge,clk,),q=,rega,;,endmodule,组合逻辑中的寄存器类型举例,在这个例子中,y,和,rega,总是赋新值,因此产生一个纯组合逻辑。,module ex3reg(y,a,b,c);,input a,b,c;,output y;,reg,y,rega,;,always(a or b or c),begin,if(a&b),rega,=c;,else,rega,=0;,y=,rega,;,end,endmodule,在这个例子中,,rega,不总是产生新值,因此会产生一个锁存器,,y,是锁存器的输出,module ex4reg(y,a,b,c);,input a,b,c;,output y;,reg,y,rega,;,always(a or b or c),begin,if(a&b),rega,=c;,y=,rega,;,end,endmodule,在下面的例子,,rega,是暂存变量,并被优化掉,敏感列表,敏感表不完全,:,module,sens,(a,q,b,sl,);,input a,b,sl,;,output q;,reg,q;,always(,sl,),begin,if(!,sl,),q=a;,else,q=b;,end,endmodule,完全的敏感列表,module,sensc,(q,a,b,sl,);,input a,b,sl,;,output q;,reg,q;,always(,sl,or a or b),begin,if(!,sl,),q=a;,else,q=b;,end,endmodule,在下面的例子,,a,b,sl,是块的输入,sl,用作条件,a,、,b,用在过程赋值语句的右边,将块的所有输入都列入敏感表是很好的描述习惯。不同的综合工具对不完全敏感表的处理有所不同。有的将不完全敏感表当作非法。其他的则产生一个警告并假设敏感表是完全的。在这种情况下,综合输出和,RTL,描述的仿真结果可能不一致。,敏感列表,将块的所有输入都列入敏感表是很好的描述习惯。不同的综合工具对不完全敏感表的处理有所不同。有的将不完全敏感表当作非法。其他的则产生一个警告并假设敏感表是完全的。在这种情况下,综合输出和,RTL,描述的仿真结果可能不一致。,上述两例综合结果(,SYNOPSYS,)相同,但,RTL,描述的仿真结果不同。也就是左边的敏感表不完全的例子的,RTL,描述和综合出的网表的仿真结果不同。,module,sens_t,;,reg,a,b,sl,;,sens,u1(a,q,b,sl,);,sensc,u2(qc,a,b,sl,);,initial,begin,$,monitor($time,%b,%b,%b,%b,%b,a,b,sl,q,qc);,a=0;b=0;sl=0;,#10 a=1;,#10,sl,=1;,#10,sl,=0;,#10$finish;,end,endmodule,0 0 0 0 0 0,10 1 0 0 0 1,20 1 0 1 0 0,30 1 0 0 1 1,持续赋值,module,orand,(out,a,b,c,d,e);,input a,b,c,d,e;,output out;,assign out=e,endmodule,持续赋值驱动值到,net,上。因为驱动是持续的,所以输出将随任意输入的改变而随时更新,因此将产生组合逻辑。,过程持续赋值,module,latch_quasi,(q,en,d);,input en,d;,output q;,reg,q;,always(en),if(en),assign q=d;,else,deassign,q;,endmodule,过程持续赋值是在过程块(,always,或,initial,)内给一个寄存器数据类型进行的持续赋值。这在大多数综合工具中是非法的。,综合指示,大多数综合工具都能处理综合指示。,综合指示可以嵌在,Verilog,注释中,因此他们在,Verilog,仿真时忽略,只在综合工具解析时有意义。,不同工具使用的综合指示在语法上不同。但其目的相同,都是在,RTL,代码内部进行最优化。,通常综合指示中包含工具或公司的名称。例如,下面介绍的,Envisia,Ambit synthesis,工具的编译指示都以,ambit synthesis,开头。,综合指示,这里列出部分,Cadence,综合工具中综合指示。这些与其他工具,如,Synopsys,Design Compiler,,中的指示很相似。,/ambit synthesis on,/ambit synthesis off,/ambit synthesis case=full,parallel,mux,结构指示,/ambit synthesis architecture=,cla,or,rpl,FSM,指示,/ambit synthesis,enum,xyz,/ambit synthesis,state_vector,sig,state_vector,_ flag,综合指示,case,指示,case,语句通常综合为一个优先级编码器,列表中每个,case,项都比后面的,case,项的优先级高。,Case,指示按下面所示指示优化器:,/ambit synthesis case=parallel,建立并行的编码逻辑,彼此无优先级。,/ambit synthesis case=,mux,若库中有多路器,使用多路器建立编码逻辑。,/ambit synthesis case=full,假定所有缺少的,case,项都是“无关”项,使逻辑更为优化并避免产生锁存器。,条件语句,自然完全的条件语句,module,comcase,(a,b,c,d,e);,input a,b,c,d;,output e;,reg,e;,always(a or b or c or d),case(a,b),2b11:e=d;,2b10:e=c;,2b01:e=1b0;,2b00:e=1b1;,endcase,endmodule,module,compif,(a,b,c,d,e);,input a,b,c,d;,output e;,reg,e;,always(a or b or c or d),if(a&b),e=d;,else if(a&b),e=c;,else if(a&b),e=1b0;,else if(a&b),e=1b1;,endmodule,例中定义了所有可能的选项,综合结果是纯组合逻辑,没有不期望的锁存器产生。,不完全条件语句,module,inccase,(a,b,c,d,e);,input a,b,c,d;,output e;,reg,e;,always(a or b or c or d),case(a,b),2b11:e=d;,2b10:e=c;,endcase,endmodule,module,incpif,(a,b,c,d,e);,input a,b,c,d;,output e;,reg,e;,always(a or b or c or d),if(a&b),e=d;,else if(a&b),e=c;,endmodule,在上面的例子中,当,a,变为零时,不对,e,赋新值。因此,e,保存其值直到,a,变为,1,。这是锁存器的特性。,若,a,变为,0,,,e,为何值,default,完全条件语句,module,comcase,(a,b,c,d,e);,input a,b,c,d;,output e;,reg,e;,always(a or b or c or d),case(a,b),2b11:e=d;,2b10:e=c;,default:e=,bx,;,endcase,endmodule,module,compif,(a,b,c,d,e);,input a,b,c,d;,output e;,reg,e;,always(a or b or c or d),if(a&b),e=d;,else if(a&b),e=c;,else,e=,bx,;,endmodule,综合工具将,bx,作为无关值,因此,if,语句类似于“,full case”,,可以进行更好的优化。,例中没有定义所有选项,但对没有定义的项给出了缺省行为。同样,其综合结果为纯组合逻辑,没有不期望的锁存器产生。,指示完全条件语句,module,dircase,(a,b,c,d);,input b,c;,input 1:0 a;,output d;,reg,d;,always(a or b or c),case(a)/,ambit synthesis case=full,2b00:d=b;,2b01:d=c;,endcase,endmodule,和前例一样,没有定义所有,case,项,但综合指示通知优化器缺少的,case,项不会发生。结果也为纯组合逻辑,没有不期望锁存器产生。注意如果缺少的,case,项发生,而其结果未定义,综合结果和,RTL,的描述的行为可能不同。,case,指示例外,module select(a,b,sl,);,input 1:0,sl,;,output a,b;,req,a,b;,always(,sl,),case(,sl,)/ambit synthesis case=full,2b00:begin a=0;b=0;end,2b01:begin a=1;b=1;end,2b10:begin a=0;b=1;end,2b11:b=1;,default:begin a=,bx,;b=,bx,;end,endcase,endmodule,有时使用了,case full,指示,,case,语句也可能综合出,latch,。,下面的描述综合时产生了一个,latch,。,函数,module,orand,(out,a,b,c,d,e);,input a,b,c,d,e;,output out;wire out;,assign out=,forand,(a,b,c,d,e);,function,forand,;,input a,b,c,d,e;,if(e=1),forand,=(a|b),else,forand,=0;,endfunction,endmodule,函数没有时序控制,因此综合结果为组合逻辑。函数可以在过程块内或持续赋值语句中调用。,下例中的,or/and,块由持续赋值语句调用函数实现,任务,module,orandtask,(out,a,b,c,d,e);,input a,b,c,d,e;,output out;,reg,out;,always(a or b or c or d or e),orand,(out,a,b,c,d,e);,task,orand,;,input a,b,c,d,e;,output out;,if(e=1),out=(a|b),else,out=0;,endtask,endmodule,任务一般只在测试基准使用,因为:,没有时序控制的任务如同函数,带有时序控制的任务不可综合,下面是用任务描述的,or/and,块:,锁存器(,latch,)推断,module latch(q,data,enable);,input data,enable;,output q;,reg,q;,always(enable or data),if(enable),q=data;,endmodule,在,always,块中,如果没有说明所有条件,将产生,latch,。,在下面的例子中,由于没有定义,enable,为低电平时,data,的状态,因此,enable,为低电平时,data,的值必须保持,综合时将产生一个存储元件,同步反馈,(feedback),推断,有反馈,:,module,dffn,(q,d,clk,en);,input d,clk,en;,output q;,reg,q;,always(,negedge,clk,),if(en),q=d;,endmodule,综合工具一般不支持组合逻辑反馈,但支持同步反馈。,在同步过程块中,如果条件语句的一个分支没有给所有输出赋值,则推断出反馈。,无反馈:,module,dffn,(q,d,clk,en);,input d,clk,en;,output q;,reg,q;,always(,negedge,clk,),if(en),q=d;,else,q=,bx,;,endmodule,带使能的寄存器,module,dffn,(q,d,clk,en);,input d,clk,en;,output q;,reg,q;,always(,negedge,clk,),if(en),q=d;,endmodule,上述带反馈的描述用于带使能端的寄存器的描述。在寄存器的描述中,敏感列表是不完全的。,阻塞或非阻塞,使用的赋值类型依赖于所描述的逻辑类型:,在时序块,RTL,代码中使用非阻塞赋值,非阻塞赋值保存值直到时间片段的结束,从而避免仿真时的竞争情况或结果的不确定性,在组合的,RTL,代码中使用阻塞赋值,阻塞赋值立即执行,阻塞、非阻塞对比,非阻塞赋值语句并行执行,因此临时变量不可避免地在一个周期中被赋值,在下一个周期中被采样。,module bloc(,clk,a,b);,input,clk,a;,output b;,reg,y;,reg,b;,always(,posedge,clk,),begin,y=a;,b=y;,end,endmodule,module,nonbloc,(,clk,a,b);,input,clk,a;,output b;,reg,y;,reg,b;,always(,posedge,clk,),begin,y=a;,b=y;,end,endmodule,使用阻塞赋值,此描述综合出一个,D flip-flop:,使用非阻塞赋值,此描述将综合出两个,D Flip-flop,。,复位,复位是可综合编码风格的重要环节。状态机中一般都有复位。,module sync(q,ck,r,d);,input ck,d,rst,;,output q;,reg,q;,always(,negedge,ck),if(r),q=0;,else,q=d;,endmodule,module,async,(q,ck,r,d);,input ck,d,r;,output q;,reg,q;,always(,negedge,ck or,posedge,r),if(r),q=0;,else,q=d;,endmodule,同步复位,同步块的异步复位,同步复位描述:在同步块内,当复位信号有效时,进行复位操作;当复位信号无效时,执行该块的同步行为。如果将复位信号作为条件语句的条件,且在第一个分支中进行复位,综合工具可以更容易的识别复位信号。,异步复位:在同步块的敏感表中包含复位信号的激活边沿。在块内,复位描述方式与同步方式相同。,复位,下面的异步复位描述(异步复位和同步块分开)是一种很不好的描述风格,并且有的综合工具不支持。在仿真中,如果,r,和,ck,在同一时刻改变,则结果不可确定。,module,async,(q,ck,r,d);,input ck,d,r;,output q;,reg,q;,always(,negedge,ck),if(!r)q=d;,always(,posedge,r),q=0;,endmodule,不好的异步复位描述方式,带复位、置位的锁存器,latch,下面的例子给出了一个复杂一些的复位分支。由于是一个,latch,,因此敏感表是完全的。,module latch(q,enable,set,clr,d);,input enable,d,set,clr,;,output q;,reg,q;,always(enable or set or,clr,or d),begin,if(set),q=1;,else if(,clr,),q=0;,else if(enable),q=d;,end,endmodule,有限状态机,有限状态机有两种不同类型,显式和隐式。,隐式状态机用多个,(,posedge,clk,),语句指出状态跳变。,隐式状态机的抽象级比显式状态机高,通常不可综合。,显式状态机用,case,语句显式定义每个可能状态。,通常,显式状态机用于可综合代码描述。,显式有限状态机,timescale 1ns/100ps,module state4(clock,reset,out);,input reset,clock;,output 1:0 out;,reg,1:0 out;,parameter/,状态变量枚举,stateA,=2b00,stateB,=2b01,stateC,=2b10,stateD,=2b11;,reg,1:0 state;/,状态寄存器,reg,1:0,nextstate,;,always(,posedge,clock),if(reset)/,同步复位,state=,stateA,;,else,state=,nextstate,;,always(state)/,定义下一状态的组合逻辑,case(state),stateA,:begin,nextstate,=,stateB,;,out=2b00;/,输出决定于当前状态,end,stateB,:begin,nextstate,=,stateC,;,out=2b11;,end,stateC,:begin,nextstate,=,stateD,;,out=2b10;,end,stateD,:begin,nextstate,=,stateA,;,out=2b00;,end,endcase,endmodule,有限状态机,FSM,指导,enum,指导,状态赋值枚举,也用来将状态赋值捆绑到状态向量。,state_vector,指导,定义状态寄存器和编码类型,状态机的描述也有综合指导。在,RTL,代码中,,FSM,指导向优化器传递状态机有关的特性信息。,这些指导有:,FSM,指导,timescale 1ns/100ps,module state4(clock,reset,out);,input reset,clock;,output 1:0 out;,reg,1:0 out;,parameter,/*ambit synthesis,enum,state_info,*/,stateA,=2b00,stateB,=2b01,stateC,=2b10,stateD,=2b11;,reg,1:0,/*ambit synthesis,enum,state_info,*/,state;,reg,1:0,/*ambit synthesis,enum,state_info,*/,nextstate,;,always(,posedge,clock),/*ambit synthesis,state_vector,state -encoding,one_hot,*/,if(reset),state=,stateA,;,else,state=,nextstate,;,.,枚举名称定义,枚举名称限用于,state,、,nextstate,向量,定义状态寄存器并指定编码格式,资源共享,资源共享是指多节代码共享一组逻辑。例如:,always(a or b or c or d),if(a),out=b+c;,else,out=b+d;,没有资源共享,资源共享,资源共享与所用综合工具有关。但通常,要共享资源,表达式必须在同一个,always,块中的同一个条件语句中。,资源共享,资源共享可以由,RTL,代码控制。例如,可以改变编码风格强制资源共享。,if(a),out=b+c;,else,out=b+d;,原始代码,强制资源共享,temp=a?c:d;,out=b+temp;,或,out=b+(a?c:d);,复杂操作符,大多数工具可以将它映射为一个乘法器。,专用宏单元库中可能有乘法器。宏单元库中的元件的复杂程度要比常规单元库高。,宏单元库可以包含部分可重用设计,如,FIFO,,加法器,减法器(各种结构),移位寄存器,计数器和解码器等。、,宏单元库还可以包括用户自定义的可重用块,由用户自己设计并综合。,复杂操作符是可以被识别为高层操作并被直接映射到一个向量库内以存在单元的操作。例如:,out=a*b;,综合工具不能胜任的工作,时钟树,复杂的时钟方案,组合逻辑反馈循环和脉冲发生器,存储器,,IO,专用宏单元,总做得和你一样好,综合工具不能胜任的工作,综合工具善于优化组合逻辑。但设计中有很大一部分不是组合逻辑。,例如,时钟树。时钟树是全局的、芯片范围的问题。在没有版图布局信息的情况下,要给出较优的结果,综合工具对块的大小有一定的限制。,综合工具不能很好地处理复杂时钟。通常,只允许要综合的块含有一个时钟。但设计中经常使用两相时钟或在双沿时钟。,综合工具不易实现脉冲产生逻辑,如单个脉冲,或结果依赖于反馈路径延迟的组合反馈逻辑。对这种情况,插入延迟元件使一个信号推迟到达的效果并不好。,不能用综合产生大块存储器,因为综合工具会用,flip-flop,实现。,不是所有的综合工具都能很好地从工艺库里挑选择大的单元或宏单元,这需要用户人工实例化。一些宏单元,例如大的结构规则的数据通路元件,最好使用生产商提供的硅编译器产生。,综合工具不保证产生最小结果。通常综合结果不如人工结果,只要你有足够的时间。,可编程逻辑器件相关问题,迄今为止,很多注释假定综合为,ASIC,。对,FPGA,,存在一些不同问题。所有,ASIC,综合工具以同样的方式工作,使用同样的优化算法,且目标工艺库的单元也是相似的。众所周知,,FPGA,使用不同的技术,,EEPROM,,,SRAM,和,anti-fuse,,且每个开发商有不同的构造块,这些块比,ASIC,使用的基本门要大很多。,对特定的,FPGA,,其结构是固定的,限制了静态时序分析的效用,因为,ASIC,的路径延迟变化的范围很大,而,FPGA,是可预测的。而且,,FPGA,设计时通常使用专用结构,而这些专用结构很难由综合工具实现。,因此,Verilog,代码需要技术与工艺专用指导,这些指导由,FPGA,开发商提供的软件的算法识别,而仿真时忽略。这些指导通常由用户自定义属性,注释或直接实例化专用单元。这会限制,Verilog,的技术独立性和可移植性。,关键问题是综合工具能够多好地处理所选的技术。要得到一个好的结果,需要结构专用算法。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 行业资料 > 医学/心理学

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服