原创 [Verilog HDL 建模技巧 :低级建模 仿顺序操作·思路篇] 10 - 组织模块和两义性问题

2010-6-5 17:01 2507 6 7 分类: FPGA/CPLD

4.2 “低级功能模块”封装 和“两义性”或者“多义性”的问题 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


点击看大图



如上的示意图。当我们要封装2个“低级功能模块”在一次,如果两个“低级功能模块”使用同一个输入(重用输入连线)或者同一个输出(重用输出连线)就会出现两义性的问题。为了解决这个问题,使用“多路选择器”便可以。


 


1.module flashing_module


2.(


3.    CLK, RSTn,


4.    Right_Start_Sig, Left_Start_Sig, Right_Done_Sig, Left_Done_Sig, 


5.    Q


6.);


7.  


8.     input CLK;


9.     input RSTn;


10.    input Right_Start_Sig;


11.    input Left_Start_Sig;


12.    


13.    output Right_Done_Sig;


14.    output Left_Done_Sig;


15.    output [7:0]Q;


16.    


17.    /*******************************/


18.    


19.    wire [7:0]Q_U1;


20.    


21.    flashing_to_right U1


22.    (


23.        .CLK( CLK ),       // input - from top


24.        .RSTn( RSTn ), // input - from top


25.        .Start_Sig( Right_Start_Sig ),  // input - from top


26.        .Done_Sig( Right_Done_Sig ),  // output - to top


27.        .Q( Q_U1 ) // output - to wire


28.    );


29.    


30.    /********************************/


31.    


32.    wire [7:0]Q_U2;


33.    


34.    flashing_to_left U2


35.    (


36.        .CLK( CLK ),              // input - from top


37.        .RSTn( RSTn ),             // input - from top


38.        .Start_Sig( Left_Start_Sig ),   // input - from top


39.        .Done_Sig( Left_Done_Sig ), // output - to top


40.        .Q( Q_U2 ) // output - to wire


41.    );


42.    


43.    /*************************************/


44.     


45.    reg [7:0]rQ;


46.    


47.    always @ ( * ) 


48.    if( Right_Start_Sig ) rQ = Q_U1;


49.    else if( Left_Start_Sig ) rQ = Q_U2;


50.    else rQ = 3'dx;


51.      


52.    assign Q = rQ;  


53.    


54.    /*************************************/


55.    


56.endmodule    



 


为了解决多“两义性”或者“多义性”的问题多路选择器常常被使用。如上述代码中45~52行(从第27,第40行引出“连线”)Q_U1”和“Q_U2”被if控制着输出。这样的写法是最优化的,生成的RTL图也非常的整洁。


 


点击看大图


 


当然还有其他的写法:


 


assign Q = Right_Start_Sig ? Q_U1 : Q_U2 ;


 


虽然如上的写法和,第4552行的写法相比,更为简洁,而且生成的 RTL图也一样。但是这样的写法有如下的弱点:


 


1. 解读性很差。


2. 只能解决两义性的问题而已。


 


所以不怎么推荐使用。


 


还有一中更糟糕的写法:


 


    reg [7:0]rQ;


    


    always @ ( * ) 


    case( { Right_Start_Sig, Left_Start_Sig } ) 


        2'b10   : rQ = Q_U1;


        2'b01   : rQ = Q_U2;


        default : rQ = 3'bxxx


    endcase


      


assign Q = rQ;


 

 


虽然该写法的解读性很高效果也一样,但是却很浪费资源。生成的RTL图如下:


 


点击看大图



 


和上述两个写法相比,它可差多了,所以不推荐使用。


 


/**********************************************************/


 


    reg [7:0]rQ;


    


    always @ ( * ) 


    if( Right_Start_Sig ) rQ = Q_U1;


    else if( Left_Start_Sig ) rQ = Q_U2;


    else rQ = 3'dx;


      


assign Q = rQ;  


 


接下来,我们来分析上面的代码。


 


 


    always @ ( * )


 


 


always @ ( * )”这样的写法在Verilog HDL 2001 中已经被支持(好像是这个版本)。在敏感包中的“*”,可以理解为“任何状况都有效”。


 


 


    if( Right_Start_Sig ) rQ = Q_U1;


    else if( Left_Start_Sig ) rQ = Q_U2;


 else rQ = 3'dx;  //不能省略掉


 


 


而“else rQ = 3'dx”,这行不能被省略掉。不要问我为什么,这是V语言的编程规则。你尝试注释掉后,再编译看看,你会发现会很多“Warning”。


 


    


       always @ ( * ) 


   x   if( Right_Start_Sig ) Q = Q_U1;//连线 QQ_U1 和 Q_U2 之间没有


   x   else if( Left_Start_Sig ) Q = Q_U2; //寄存器驱动


   x   else Q = 3'dx;


 

 



还有一点请注意,因为“Q_U1”和“Q_U2”是连线的关系,所以必须使用寄存器来驱动。如上的代码中“rQ”便是扮演这样的角色。如果该寄存器被省略了,会出现编译错误。


 


总结:


“两义性”或者“多义性”的问题,不仅在“低级建模”中出现,日常的建模也会出现它们的踪影,然而“低级建模”出现的频率比较高罢了。“多路选择器”在设计的时候应该经多方面的考虑,亦即取得最平衡的效果。


 


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1528479 2011-3-28 17:34

"else rQ=3'dx;" 这一句是为了防止综合时产生不必要的latch,,
相关推荐阅读
用户1609127 2011-10-22 18:26
Verilog的私私细语 - 时钟化和信号的长度
目录 第2章 时钟化和信号的长度 2.01 一个时钟一块数据的概念 2.02 信号时钟化 2.03 深入了解模块的沟通 2.04 电平检测模块的整合(即时事件在时序上的不和谐)      实验八:电...
用户1609127 2011-09-08 12:47
瞎搞Time Quest 和无责任的笔记 第二章
最近整合篇的第二章的构思和灵感都累积不少了,应该是时候开工了。恰好手头上还有一本笔记还没有写完,就是这本瞎搞TimeQuest的第二章。目录笔者也懒得贴了,看过第一章的同学多少也会猜到第二章的内容是什...
用户1609127 2011-08-29 18:21
瞎搞Time Quest 和无责任的笔记 第一章
哎呀 ... 潜水了都有一段时间了,这是最近研究的成果和目标。 话说TimeQuest这个东西真的很搞怪呀,做得笔者不得不从其他的方向去研究它。 好了还是切入正题,TimeQuest用作静态时序的工具...
用户1609127 2011-07-06 17:43
Verilog的私私细语 - 整合的概念
目录         02  第1章  整合的概念          1.01  源码上的整合                   实验一:字面上的整合          1.02  时钟和步骤的定...
用户1609127 2011-06-22 10:18
VerilogHDL那些事儿 - 建模篇v4 + 时序篇v1
VerilogHDL那些事儿 - 建模篇v4 ====== v4 ====== 主要是修改了大量用法上的BUG和极限的精简内容 https://docs.google.com/leaf?id=0B...
用户1609127 2011-06-10 13:19
Verilog HDL的礼物 - Verilog HDL扫盲文
目录 02第0章 Verilog HDL语言扫盲文 030.01 各种的HDL语言 030.02 HDL语言的层次 03 0.03 RTL级和组合逻辑级 040.04 Verilog HDL语言真的那...
我要评论
1
6
关闭 站长推荐上一条 /3 下一条