找回密码
 注册
关于网站域名变更的通知
查看: 246|回复: 1
打印 上一主题 下一主题

网友经验分享: Verilog设计注意

[复制链接]
  • TA的每日心情
    开心
    2019-11-19 15:19
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2018-11-2 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    ; K' g7 B6 w5 Y- N% r
    网友经验分享: Verilog设计注意

    : O  Q4 @! n; U1 S组合逻辑- o4 ~5 o( [! Z: D/ P! Q1 e
    1.敏感变量的描述完备性7 G, ~( f* G' q1 s9 m
    Verilog中,用always块设计组合逻辑电路时,在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。综合器会发出警告。; `" _$ p% {8 w  ]/ K

    ) U: d! t7 B1 h) T6 o1 EExample1:
    / [6 e# F1 J8 P- @+ ninput a,b,c;9 F* i" k- q; d  z/ _7 L
    reg e,d;# a6 u! m) r! ?. x
    always @(a or b or c)
    4 C( b% a  G, t+ z  G% N$ ~# }6 x    begin
    ! x2 K7 p1 W% e- ~& I    e=d&a&b; /*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变
    + b! x7 B9 |) W2 q, P化*/! i' S8 U* {& Q; C( F  g9 T# W
        d=e |c;
    0 i4 P) u# H, L- @5 @    end " u) x5 F" N+ K: q3 e4 C
        . w  S7 o' ]  [& E  F# h3 u
    Example2:& `" D" t3 d; @" Q
    input a,b,c;
    / l& e: j- l- Q! N- A( Oreg e,d;
    - U1 u- h: _! M) W$ ]$ H7 [  dalways @(a or b or c or d)
    + b% U5 `1 z+ R8 u    begin# Z0 k# C0 L% {. C, r7 K3 V3 P
        e=d&a&b; /*d在敏感电平列表中,d变化时e立刻变化*/
    & e. G2 i$ M! G; w  K/ Z    d=e |c;
    $ r7 L, N# I! I2 X' \    end  
    * ^: |$ _3 G+ x2.条件的描述完备性; e( J  j6 q3 l: p2 t
    如果if语句和case语句的条件描述不完备,也会造成不必要的锁存器。
    ' \% n- Z, r7 u3 \/ i4 R0 S4 c- R& @) O
    Example1:   
    2 {1 J# ^6 k  y5 J. ?if (a==1'b1) q=1'b1;//如果a==1'b0,q=? q将保持原值不变,生成锁存器!: H# t; ~, p: v
    Example2: + Q8 @! t. h! m& {4 ]7 j
    if (a==1'b1) q=1'b1;2 D" A5 W4 F( J. h# }5 e# y$ M
    else         q=1'b0;//q有明确的值。不会生成锁存器!* H& E, Y! |6 W7 |* O
    & ]; m7 Y% w! {& A, o
    Example3:
    5 ^8 v. T+ V: |/ F: L4 b* A0 B& G   reg[1:0] a,q;
    4 s1 S+ q$ f$ L+ t5 u( k0 x   ....
    $ h5 Q' e" r: i) A6 ^- F! o   case (a). X2 _5 ], n3 `! ^2 u% ?1 o: D
          2'b00 : q=2'b00;/ C$ G( @0 r7 U! y8 }. w" G
          2'b01 : q=2'b11;//如果a==2'b10或a==2'b11,q=? q将保持原值不变,锁存器!
    # w2 Z+ ?4 }+ F; n) P2 R   endcase" ~' I( Y1 r7 ]& t$ ]9 ]
       
    . p  K( ~1 |" G2 Q- @Example4:6 x2 L& U' t, q3 u
       reg[1:0] a,q;
    2 [6 W1 N; S2 p" X- V   ....
    " t4 \6 V3 h. l& I5 B  i   case (a)  s' v7 _9 t& j* i; W3 o3 X% h, q
          2'b00 : q=2'b00;
    & ]) u) w1 G2 Y% u9 G      2'b01 : q=2'b11;& Q6 O9 t3 h" ^+ B' N
          default: q=2'b00;//q有明确的值。不会生成锁存器!
    1 }0 ?- \5 u# r   endcase+ Q. ^: ?: W! ?2 m, [5 A; @# g
    . d7 a* J5 F$ Y, C" p1 {$ ]: L( ]5 \
    Verilog中端口的描述
    6 E" F" R4 h$ j% v% W1.端口的位宽最好定义在I/O说明中,不要放在数据类型定义中;
    ( N6 T1 ~: J; e7 r, sExample1: 7 ^8 A4 U/ P  q3 N
    module test(addr,read,write,datain,dataout)
    # `" I' W% Z2 h- J$ \7 }; x9 d2 Jinput[7:0]  datain;
    0 D. @- g' u: Y8 A/ r8 Qinput[15:0] addr;/ }3 {; {# c( R0 F/ D
    input       read,write;2 K( a0 ?- i* _; r, f* `
    output[7:0] dataout;  //要这样定义端口的位宽!. k& G& j- K) n3 G4 F0 @" h/ X

    5 `- Y$ P5 C$ J& R$ z0 gwire addr,read,write,datain;4 i! a0 ]5 Q% F
    reg  dataout;; s  ~! D% j1 E: h

    ) o% w9 D4 u; G" SExample2:
    ' e) B( ~1 Y! e7 R. A6 qmodule test(addr,read,write,datain,dataout)
    * c1 {" g. C* {3 I( K: S! t& z; n. dinput  datain,addr,read,write;! t. ]& q2 J9 ]/ q
    output dataout;* W  [& v2 u  F1 ^! _$ }9 s0 ]4 u. C

    / ^' _( ~: L2 `- L" t8 z/ Mwire[15:0] addr;5 Y* X. w6 v: ?8 j
    wire[7:0]  datain;
    . G- s% B) \3 f8 Hwire       read,write;
    # Z- y6 w* ^9 j8 v! @, m; Y. xreg[7:0]   dataout;   // 不要这样定义端口的位宽!!. L* p5 U4 _' Y$ O0 m/ R
    2.端口的I/O与数据类型的关系:
    . }3 b! c7 r: ^& W  s9 @" L     端口的I/O         端 口 的     数 据 类 型
    % @; s/ }3 n8 N& t5 n- R                       module内部     module外部
    % t1 d2 Y$ l- H- E3 n, }      input              wire             wire或reg3 M# o! t0 U: P! m& a
          output         wire或reg       wire7 T  _& w* D- F; H
          inout            wire               wire
    / r! }/ b2 e$ e0 T8 ~' e9 Y7 L3.assign语句的左端变量必须是wire;直接用"="给变量赋值时左端变量必须是reg!  z& T' |* ~/ }" e6 r$ D+ c+ Z

    $ l& b+ _2 J' B. [% {; dExample:; P0 `; ~. U) ?4 F5 ]
    assign a=b; //a必须被定义为wire!!# o+ V- Z8 W2 u: Q
    ********
    ' F# q: \: w8 \5 T0 I- M0 Dbegin
    # \: }: x; A) j   a=b; //a必须被定义为reg!
    ! P- W- e: h0 K! Rend# c; i0 y) [* D" w

    $ i* ^; X- V% W$ i* zVHDL中STD_LOGIC_VECTOR 和 INTEGER 的区别例如 A 是INTEGER型,范围从0到255;B是STD_LOGIC_VECTOR,定义为8位。A累加到255时,再加1就一直保持255不变,不会自动反转到0,除非令其为0;而B累加到255时,再加1就会自动反转到0。所以在使用时要特别注意!! O8 N* Y% ?  k9 b3 p
    1.无置位/清零的时序逻辑
    % B* r  [7 R) A/ p$ |- P    always @( posedge CLK)% k5 [6 r7 Z; d! D# t
           begin' I6 h6 {4 `  _% R, d
           Q<=D;
    ! p/ o% R" H! P/ @* p3 c       end; t) o5 D2 G' R' O. g9 [& w
    2.有异步置位/清零的时序逻辑 ; |3 c6 M7 I3 D2 q; B
       异步置位/清零是与时钟无关的,当异步置位/清零信号到来时,触发器的输出立即
    & [( I- ^& v1 g2 X4 d/ G   被置为1或0,不需要等到时钟沿到来才置位/清零。所以,必须要把置位/清零信号1 ]/ z; Z- v+ _+ v2 z; [$ l
       列入always块的事件控制表达式。* U* m( U5 Q* k) A) D9 l3 [
        always @( posedge CLK or negedge RESET)
    1 n4 O% F. e# m       begin
    2 T; F+ @2 E1 U# a$ g& N       if (!RESET)
    + U* w0 Z& H; V- p* a. h          Q=0;5 Q3 K0 o( g& [1 F0 ?% A8 Q
           else( Z+ g4 y; j% K* G0 e( r
              Q<=D;
    % \$ [2 j) c7 P. Q! r       end     
    2 S3 D/ F& U9 @: [3.同步置位/清零的时序逻辑) ]: y) U. P/ V1 d
        同步置位/清零是指只有在时钟的有效跳变时刻置位/清零,才能使触发器的输出分
    ' t: l- i& e0 m9 p    别转换为1或0。所以,不要把置位/清零信号列入always块的事件控制表达式。但是) }0 L# C! b" r$ S7 v3 P! d4 T
        必须在always块中首先检查置位/清零信号的电平。   
    + V9 G0 X5 k0 D6 V0 T* l* f" L    always @( posedge CLK )$ g" d( `8 ?  Z9 [, n7 c
           begin1 S, N0 I+ c8 @5 n8 m+ I
           if (!RESET)
    8 {: K( |9 V: {+ x  Y/ P          Q=0;* A% f% }- I! a6 X3 B, s) D
           else
    0 H( B! ]9 }8 w$ Z$ d1 J          Q<=D;
    " y# Z1 j# s9 q; i8 a" L       end ; ]1 m. [! g# q* s9 b# q% g
                
    . |% C1 n: v, R7 W( Z) s, x结构规范性
    / f' Y! H$ k1 l8 w2 t9 Q$ _+ n- |  K6 P  在整个芯片设计项目中,行为设计和结构设计的编码是最重要的一个步骤。
    3 a! Q* f- t, Q9 S5 M  它对逻辑综合和布线结果、时序测定、校验能力、测试能力甚至产品支持都有重要的影响。考虑到仿真器和真实的逻辑电路之间的差异,为了有效的进行仿真测试:
    . A! q7 a; a* a4 V8 U1.避免使用内部生成的时钟# {: U/ i% ?, a5 ^
         内部生成的时钟称为门生时钟(gated clock)。如果外部输入时钟和门生时钟同
    ) v5 g! A2 i* P  j8 ?5 [% ~时驱动,则不可避免的两者的步调不一致,造成逻辑混乱。而且,门生时钟将会增加测试的: n3 l2 A: f0 W$ F' [, o( O
    难度和时间。
    4 Y4 g& ~) l- U2 {- K2.绝对避免使用内部生成的异步置位/清零信号
    1 N) f5 ]* W$ F3 V7 W7 @6 j+ s8 u     内部生成的置位/清零信号会引起测试问题。使某些输出信号被置位或清零,无法正常测试。
    7 M8 r9 o$ H% P, ]7 F3.避免使用锁存器' ~% ?% m) B/ |2 v
         锁存器可能引起测试问题。对于测试向量自动生成(ATPG),为了使扫描进行,锁存器需要置为透明模式(transparent mode),反过来,测试锁存器需要构造特定的向量,这可非同一般。
    2 G/ j3 i$ Q9 U5 h3 m2 v3 [" Y  B+ l4.时序过程要有明确的复位值
    ; P* o; I+ e, n% V, F, n+ m    使触发器带有复位端,在制造测试、ATPG以及模拟初始化时,可以对整个电路进行快速复位。; l; j# ~+ U8 z) z" o& L
    5.避免模块内的三态/双向
    8 w9 c' C5 O) m     内部三态信号在制造测试和逻辑综合过程中难于处理. 6 n6 p1 \: f" v7 x! S
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-6 07:28 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表