verilog中条件分支语句的综合问题


在·Verilog中有两种可综合的条件结构:

if(expression) Statement block else if(expression) Statement block else Statement blockcase(expression) case item : case action ... (default : case action) endcase


若条件结构的所有可能情况都被考虑到了就称为完整,如前两句:

if(select) out=in; else out=~in; if(select) out=in;


完整的if语句会综合出一个多路选择器。而不完整的if语句则会综合其他结构,如后一句就会综合出一个D型触发器,即综合器默认select为假时,保持原先的值。
对于超过三个以上的分支选项时,就会优先选择case语句。
case语句如上例所示,其中default是可选的,而且和C语音不同,case语句在第一个相匹配的case item被执行后就会终止后面case item语句的执行。case·语句是逐位比较expression的值和分支case item的值,同时case item中的X,Z也是作为正常值进行比较。于是有了另外两种case语句的变种:
casex : 将表达式和分支中的z和?符号看成是无关项。
casez : 将表达式和分支中的x,z和?符号看成是无关项。


如果所有可能情况都被考虑到,则称这样的case语句为完整的。同时如果所有情况都是相互独立的则称为并行。
因此在case语句中可能出现以下四种情况:


完整,并行。模块full_Parallel综合成多路选择器。
verilog中条件分支语句的综合问题
文章图片
verilog中条件分支语句的综合问题
文章图片



不完整,并行。模块nfull_Parallel综合成锁存器。
verilog中条件分支语句的综合问题
文章图片
verilog中条件分支语句的综合问题
文章图片



完整,不并行。模块full_nParallel综合成优先级结构。
verilog中条件分支语句的综合问题
文章图片
verilog中条件分支语句的综合问题
文章图片

当select=2'b11时,就需要进行选择,这是综合的结果选择第一个分支,因为它位于case列表的最高行,最接近输出端,具有更高的优先级。



不完整,不并行。模块nfull_nParallel综合成带优先级结构的锁存器。
verilog中条件分支语句的综合问题
文章图片
verilog中条件分支语句的综合问题
文章图片



由以上几种情况可以看出,对一个实现组合逻辑的无时钟的过程块,在每次执行时如果不能给每个变量重新赋值(即分支情况不完整),就会产生锁存器。解决办法是确保每一条case语句都有一条default语句。如图所示


verilog中条件分支语句的综合问题
文章图片

verilog中条件分支语句的综合问题
文章图片



同时当一个过程块有多个输出,但在执行时并没有在所有可能组合状态下对每一个输出赋值,也可能综合出额外的触发器。解决办法是在过程块开始执行时对所有输出赋缺省值,如果与设计不冲突的话,可以使用无关项。

【verilog中条件分支语句的综合问题】

    推荐阅读