TA的每日心情 | 开心 2019-11-20 15:00 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
大神教你如何写代码减少逻辑单元的使用数量(很实用)
; p% @% W0 o2 ~4 z. i6 T* a
0 U! z: L! p9 _/ A一....尽量不要使用"大于""小于"这样的判断语句, 这样会明显增加使用的逻辑单元数量 .看一下报告,资源使用差别很大.0 w5 Z# g# h0 v P: \9 @2 F
例程:always@(posedge clk)
& b) ]8 N% x7 d/ b begin0 W: p% ~" C) i* L. E: C
count1=count1+1;
; ~# d" M: y. J: F9 N. k if(count1==10000000)
7 U$ Z& L3 L" W0 R+ k5 K; J3 ? feng=1; //no_ring9 R7 a- \- v; n3 d# V
else if(count1==90000000)3 d3 j# \' O! a% o+ [
begin8 u' ^1 Q! X, Y9 o8 B2 j2 c
feng=0; //ring) C7 q4 q w7 H4 T. h O+ c4 D
count1=0;! J9 p1 m* }3 p4 J0 K n
end1 A& ]% G0 N7 e- U) _4 r# V& Z
end //这么写会用107个逻辑单元8 d/ B. R5 W4 u; a& {$ y9 P
// 如果把这句话if(count1==10000000)改成大于小于,报告中用了135个逻辑单元
+ X1 T7 S& U, N) U+ Y) c/ G8 ?( ^4 }二.....一定要想尽办法减少reg寄存器的长度: v% b# U) R9 p# q$ L
上次把[30:0]改到[50:0],报告里逻辑单元从100多直升到2000多!!!太吓人了,至于为什么我就不知道了哈!
% O* ^4 `4 |! u- X6 a. ]2 s三....case语句里一定要加default if一定要加else
8 Z# P& N8 L4 J/ @ 如果是组合逻辑的设计,不加default或else的话,不能保证所有的情况都有赋值,就会在内部形成一个锁存器,不再是一个纯粹的组合逻辑了,电路性能就会下降.7 c' d7 |5 J" M4 F3 J
例如:case({a,b})
) B$ @/ U- n0 F+ x/ E 2'b11 e=b;2 L) J" W( a, o3 P( S7 C: t
2'b10 e=a;
) {/ }( F7 @# J- L: ]" d3 i endcase
8 p5 I, C: Z( r+ L //不加default,虽然只关心a=1时的结果,但是a=0的时候,e就会保存原来的值,直到a变为13 Z% o- y4 a& n; F/ T& a
//那么e要保存原来的值,就要在内部生成锁存器了.
9 ^4 d+ l% ^1 N! k四....尽量使用Case语句 而不是if--else语句
9 w! y4 z, w9 c$ t 复杂的if--else语句通常会生成优先级译码逻辑,这将会增加这些路径上的组合时延
b; G+ v5 \. I- X% `4 \( |/ f8 Q用来产生复杂逻辑的Case语句通常会生成不会有太多时延的并行逻辑# t2 s& `" }! A
五...组合逻辑的always块中,要注意所有的输入全部放入敏感变量表里6 c5 q3 @; m2 S: H
比如:always@(a or b)
% D" t( m4 ~% c: ?; H begin
7 X! F2 Z+ G# p/ G' \; d) Y* T out=(a&b&c);' }5 { @6 w7 v8 f
end
. T8 t! B* _3 I" n$ S/ z3 F. L此时生成的不是纯的组合逻辑,因为当C变化时, out不会立刻发生变化(需要等到a或b变化,c的变化才会显现), 所以需要生成一个寄存器来保存C的值.. b" S3 R! `, o+ H! L) u: A; y, `
连续赋值语句的综合:从赋值语句右边提取出逻辑,用于驱动赋值语句左边的net9 g+ y- @1 P. p( v C3 y8 J
过程赋值语句的综合:从赋值语句右边提取出的逻辑,用于驱动赋值语句左边的reg型变量。注意:initia语句仅用于仿真,不综合。只有在always中才能被综合。
* j/ k* `- T4 z& \9 c建议组合逻辑用阻塞语句,时序逻辑用非阻塞语句,任何延时控制(如#5)都被综合工具器忽略。一个模块中同一个变量不能既有阻塞赋值,又有非阻塞赋值。
1 U8 o; p- A' i5 f# y# ialways语句的综合
; p. C3 d5 o' D3 x. @; s1对于组合逻辑,事件列表必须包括所有always语句中引用的变量,否则会造成综合的结果与设计功能不匹配。- k* J2 F: q, G6 R
2临时变量可以不用在事件列表中列出。
& E# f" T' f( k6 R$ K. N1 S2 Tif语句的综合
; w+ g9 g& P# I0 [" m$ B6 |! p. G8 z- x特别要注意综合出锁存器。always中,某个变量没有在所有的条件分支中被赋值,就会综合出锁存器。
|! l/ m" }. D! d w8 acase语句综合
2 i7 {' l9 {. n* M7 S7 l) h4 P和if语句一样,不完整的case分支语句也会导致锁存器的综合。. D& g$ M5 M% }: A
避免方法:# S# @) s8 d; D9 n
1)在case语句前,对要赋值的变量赋予初值
! f: m2 G4 m7 v7 talways @ (state or a or b) begin8 E, P: U+ Q/ o% J3 ]& u2 @
q =0;
5 R0 _! x$ Z$ F# @- Pcase(state)8 e2 s, q/ F# }8 L. W$ i
3'b000: q = A & B; N- [# O3 u! X' `9 S0 e
……
7 i/ e @/ q0 a1 G. E+ ]2)使用default分支语句
6 Y- [; I) d8 N0 L7 b3)使用综合指令,具体用法在case关键字行的注释中插入”synthesis full_case“7 `% n/ H5 o/ T! i: Y- y1 Y
并行CASE语句
! g/ [; r3 w, e' k9 }通常情况下case语句和if语句一样会综合出代有优先权解码的硬件电路,从上大侠选项优先级逐渐降低。但如果设计者知道case语句中的所有项是互斥的,这时候就使用”parallel_case"综合指令。$ l+ k) `1 V' J
always @(key)0 `6 D, ^( M8 O( T G
case(key) //synthesis parallel_case
' ~$ O1 m. }; ?8 ? N( o/ i8 ? 4'b0001: a = 0;
; s2 F/ s0 {* t7 ]8 A2 K endcase |
|