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

大神教你如何写代码减少逻辑单元的使用数量(很实用)

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    大神教你如何写代码减少逻辑单元的使用数量(很实用)

    8 R1 G5 O" k4 G3 R5 R! }- ~8 [9 v( U7 u, R7 r! Z
    一....尽量不要使用"大于""小于"这样的判断语句, 这样会明显增加使用的逻辑单元数量 .看一下报告,资源使用差别很大.2 g1 x# Q5 s1 B% r
         例程:always@(posedge clk)* ?( l" h& U, b+ S
       begin
    & x1 T& a* b4 O8 j    count1=count1+1;0 u$ l8 Z7 x) }  [
       if(count1==10000000)
    ! w' b: J* c" g" P7 Q7 G     feng=1;    //no_ring7 O- m* y8 B- K5 I6 {2 S! \2 f
        else if(count1==90000000)
    ( C' X* c5 f4 ]7 W8 u1 P  @% ^     begin+ S5 c. l  _. N
          feng=0;   //ring1 m/ }0 C# S% F" x) y8 `" [/ n( P
          count1=0;5 T# d' k. ^, V" `$ [+ a
        end5 \* N( {6 e' c, Q/ V0 ]
    end            //这么写会用107个逻辑单元
    6 o% R; |, l$ M; o/ D) C// 如果把这句话if(count1==10000000)改成大于小于,报告中用了135个逻辑单元. h" Q4 J) |8 }8 u
    二.....一定要想尽办法减少reg寄存器的长度
    , |4 I* E' F$ ]. {8 H     上次把[30:0]改到[50:0],报告里逻辑单元从100多直升到2000多!!!太吓人了,至于为什么我就不知道了哈!
    5 y# N: Z3 C: O/ O+ q三....case语句里一定要加default    if一定要加else) c9 Z% d" Y5 y, c; W; e
          如果是组合逻辑的设计,不加default或else的话,不能保证所有的情况都有赋值,就会在内部形成一个锁存器,不再是一个纯粹的组合逻辑了,电路性能就会下降.
    $ Y6 z9 }9 O8 @/ f* V+ S/ {; P     例如:case({a,b})
    & o( i2 ^/ H/ E' S! Y                  2'b11 e=b;
    9 ^1 h% r/ i  Y7 K1 m' s5 u                 2'b10   e=a;   
    , W- J# c5 e5 o& O             endcase
    * H% B" I& V4 ?; t- p% A7 l            //不加default,虽然只关心a=1时的结果,但是a=0的时候,e就会保存原来的值,直到a变为10 d# ?# B% m3 w1 a9 \! g- b. {0 Q
               //那么e要保存原来的值,就要在内部生成锁存器了.. q: u+ Y1 m% s9 m6 S, {
    四....尽量使用Case语句   而不是if--else语句; s. T1 F. U" J& ^: F1 u' d* q
          复杂的if--else语句通常会生成优先级译码逻辑,这将会增加这些路径上的组合时延 * U0 M1 }/ u: U8 G$ P
    用来产生复杂逻辑的Case语句通常会生成不会有太多时延的并行逻辑
      ^: j2 T8 u9 `+ g$ q2 ]6 L五...组合逻辑的always块中,要注意所有的输入全部放入敏感变量表里
    6 O- o: ~; s/ x+ \2 O      比如:always@(a or b), z$ `% Q& P8 G" d& a) g% F
                             begin
    / K, X$ o+ B; H! [                                       out=(a&b&c);* U* u+ C! X# h# X' [2 `
                             end
    : F& c+ J+ m& w+ Z2 d/ u此时生成的不是纯的组合逻辑,因为当C变化时,    out不会立刻发生变化(需要等到a或b变化,c的变化才会显现),    所以需要生成一个寄存器来保存C的值.9 t+ h7 {+ o8 K9 D4 v
    连续赋值语句的综合:从赋值语句右边提取出逻辑,用于驱动赋值语句左边的net
    ) M2 z& m. I" j/ o过程赋值语句的综合:从赋值语句右边提取出的逻辑,用于驱动赋值语句左边的reg型变量。注意:initia语句仅用于仿真,不综合。只有在always中才能被综合。
    $ Z2 P5 E  k# `3 ~3 M0 J建议组合逻辑用阻塞语句,时序逻辑用非阻塞语句,任何延时控制(如#5)都被综合工具器忽略。一个模块中同一个变量不能既有阻塞赋值,又有非阻塞赋值。
    5 r, z( i) B+ q+ malways语句的综合+ v: ?4 R7 q6 d) E+ n
    1对于组合逻辑,事件列表必须包括所有always语句中引用的变量,否则会造成综合的结果与设计功能不匹配。" k5 t6 M4 N! {' S
    2临时变量可以不用在事件列表中列出。3 k, }4 W( O0 D4 d7 D8 u7 p, w. x
    if语句的综合$ A% p, c9 [' J% r
    特别要注意综合出锁存器。always中,某个变量没有在所有的条件分支中被赋值,就会综合出锁存器。3 Q3 @* {4 M" c  x/ \
    case语句综合
    # d- q" |- R5 |% j2 K和if语句一样,不完整的case分支语句也会导致锁存器的综合。- y2 x7 e' E2 Z6 O% X
    避免方法:0 L0 A. A4 u$ ^5 K# {: t  B; y4 b4 S
    1)在case语句前,对要赋值的变量赋予初值
    : ]8 N. F5 s' R- h2 u; Dalways @ (state or a or b) begin
    9 z2 _; y/ e- {; t( O2 {" Bq =0;$ l0 q$ E5 d# t& L  g; c/ g% M# X' M
    case(state)" i' q- O0 J6 A: f4 a$ w
    3'b000: q =  A & B;
    + I' C; l! H# G2 e……
    0 N! v9 R/ a  r( y7 a* ?6 n2)使用default分支语句
    . V1 A" F/ U2 a3)使用综合指令,具体用法在case关键字行的注释中插入”synthesis full_case“
    % S8 e) l2 ]% f! K& _3 E( p: B9 @# z并行CASE语句' g& w4 Y- O2 n( r" {9 g
    通常情况下case语句和if语句一样会综合出代有优先权解码的硬件电路,从上大侠选项优先级逐渐降低。但如果设计者知道case语句中的所有项是互斥的,这时候就使用”parallel_case"综合指令。: u7 a" s' [# F
    always @(key)
    7 [: S: d6 `6 `! x( L1 u7 j! K* S case(key)     //synthesis parallel_case4 t6 N* l2 @+ g0 X9 y9 [
        4'b0001: a  = 0;% \; z+ |0 c+ s9 t# Y9 p
    endcase
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-11 21:25 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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