TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
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 |
|