|  | 
 
| 
一、 代码设计7 ]3 c- R& z! f* F$ q+ J( @9 f
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  7 v& F  K: T; N! o' E3 [
 1、设计中的FIFO、状态机接口需要有异常恢复状态和状态上报机制,格雷码电路防止被综合工具优化掉。* L- Z& ~9 g0 e% j; ]% h
 
 % A3 w$ n8 w% D5 |8 g0 h6 ~a)自行设计的格雷码FIFO(一般用于连续数据流跨时钟域)用Synplify综合时,为了防止被优化需要添加综合引导语句:“synthesis_syn_preserve = 1”;6 J9 k+ g  e( L- S" M
 
 + J! B  Y9 r4 }  z3 |b)各种综合工具均有状态机安全模式,综合时候建议打开。3 ~; k/ T+ y- B6 U$ l  R/ a0 }
 
 8 K  J# \4 y2 w8 L2、电路中所有寄存器、状态机、计数器、FIFO在单板上电复位时及使用前必须处于一个已知状态。3 z8 F: j* J5 i; j
 
 ; s8 t  S. G4 p4 I    a)对电路中的寄存器、状态机、计数器、FIFO必须进行异步复位(不依赖于任何时钟的复位);
 + r8 ?7 h/ H: x" k+ i0 o* g( E, u  c7 Y$ V  l
 b)电路中的状态机、计数器在应用的时候不能完全依赖于异步复位时的状态,对于重要的状态机或计数器,必须还有周期检测或同步并对它进行复位/置数机制,保证可靠工作。
 7 H' ~% o& d  u
 K1 a6 }0 y; {# h# D" ~3、跨时钟域以及异步信号必须同步化处理(使用的QuartusII中的Design Assistant或者专业的nlint、spyglass[1]等工具完成代码检查),这条是用FPGA进行数字电路设计的最核心最基本的思想和方法!  U9 O3 S/ d1 e8 F
 ) C+ }3 J5 p3 W1 b+ x9 x. R
 a)尽可能在整个设计中只用一个主时钟,同时只用一个时钟沿,主时钟走全局时钟网络;# a( O" F4 C- f$ @5 R
 
 8 g' e# q$ c& c1 _7 hb)推荐所有输入输出信号均通过寄存器寄存,寄存器接口当作异步接口考虑;
 % h7 v8 v: Q* B# G% Q' E* s, S3 G; w$ C9 h" d3 |
 c)当全部电路不能用同步电路思想设计时,即需要用多个时钟来实现,则可以将全部电路分成若干个局部同步电路(尽量以同一个时钟为一个模块),局部同步电路之间的接口当作异步接口考虑;
 ! }# P, S6 B* w* i2 y
 0 I. t% d9 t% x3 T: v  J# r' ad)电路的实际最高工作频率不应大于理论最高工作频率,要留有一定设计余量,保证芯片可靠工作;
 * \4 K( P6 s9 r2 b: E8 U
 2 t% d$ R, ^3 te)电路中所有寄存器、状态机在单板上电复位时应处在一个已知状态;4 k& y0 j  v0 T3 O# D$ X
 5 T8 q: y" Q/ u
 f)对于设计中的异步电路,要给出不能转换为同步设计的原因,并对该部分异步电路的工作可靠性(如时钟等信号是否有毛刺,建立保持时间是否满足要求等)做出分析判断,并提供分析报告;
 % h6 T1 g4 {0 B1 g' c' o& Z$ P) s9 S4 v; G( q9 K
 g)关于全局时钟的约束,能上全局的全部上全局,不能上全局的建议通过区域时钟约束、逻辑锁定、增量编译等保证性能;
 . k& \3 O- l! G8 K% x
 + \+ P. X. y* L9 ^* U( x, lh)依靠QuartusII中的Design Assistant或者专业的nlint/spyglass工具检查跨时钟域代码处理部分。3 a8 B! v0 Y, ^! x6 H4 a
 
 , O" e: o! U& d# u5 ^4、电路中不能出现门控时钟和行波时钟。6 p6 ~; S3 y2 @% O( y
 : x8 S  @; @/ c
 a)门控时钟的使用主要是通过关断时钟来达到降低功耗的目的,但是使用不当容易使得时钟出现毛刺,给设计带来灾难性风险。如果降功耗必要的话,推荐使用厂家自带的时钟控制的IPCORE,例如 ALTCLKCTRL;0 |* k) c3 [8 H( [. r
 
 k7 [; x6 Y2 G/ _b)行波时钟是指寄存器输出的数据又作为下一个寄存器的时钟使用。行波时钟是一个非常危险的设计,由于寄存器有Tco,它会使时钟沿变缓,延时加大,多级级联的时候情况更加恶劣,出问题是必然的!行波时钟设计实际上是一种异步设计,大部分综合布线工具都不会对行波时钟设计进行setup/hold时序分析检查,设计无法保证正确性!
 5 F' s. ?- a$ y: ~( \
 3 K* v1 g/ G3 R, b% G设计中完全没有必要使用行波时钟,可以用寄存器输出做同步使能用,与行波时钟设计意图完全一致!
 : w2 a0 v' K& J- J7 c' w" {# n
 6 O8 h, z+ A- S& O2 K$ B; r* v7 {5、需要综合的RTL源代码中不允许出现“* / %”这三个运算符。% N' o: f# u6 w% T. J
 9 O% `3 C( d' _
 a)目前大部分综合工具对以上三种运算支持的不好,而且非常浪费LE资源,而且还不能保证正确性和稳定性!可行的替代方案如下:
 0 _- K. j% q7 I6 U, q
 ; X! C' m1 i) ?“*”通过例化IPCORE或者“移位运算+加法”来实现;; m! |- V5 k$ |1 Q. `# k0 W
 0 L! j7 z2 s1 |9 y+ p1 J! I' S
 “/”通过“移位运算+加法”来近似逼近实现;例如:1/30 = 1/32 + 1/512 + 1/8192;7 g# s# e& K* V
 
 # O, \  Z. _2 V9 g; x, h“%”通过自己手动计算得到;
 0 N7 s/ K9 U" ~/ b/ z9 ^
 ) k  Z6 G3 k) m3 n+ o% {) u" }以上运算在非综合的RTL的代码中使用不受此限制。) Y4 V# {3 `  m$ o1 J
 
 ( i$ |4 C% Y5 ~& r8 y$ ~/ e# m6、条件语句必须赋值完全,即:if语句后必须有配对else语句,case、casez、casex语句中必须有default语句。
 9 I0 p) \4 N0 k3 p. r# m" Y) t. z
 a)如果if没有配对的else,case/casez/casex中没有对应的default语句的话,之后reg型数据会保持原来的值。这个在时序逻辑中可能没有太大的问题(如果设计者本意就是要保持的话),但在组合逻辑中会生成一个锁存器,锁存器逻辑往往不是设计者的意图而导致灾难性后果!
 8 j3 Z" `# U7 U! E8 X# K1 K  y8 l7 G$ J0 j3 d0 F
 为了避免不经意的犯错,建议养成良好的编码习惯:if一定要有配对的else,case/casez/casex中一定要有对应的default语句,即使要保持原来的值也要显示声明(else;或者default;)$ O/ z. r- o/ j1 t. R8 D  O
 
 7 N' P/ ?) ?' V1 @2 U* u- @7、使用器件的专用管脚和专用资源实现电路功能,这些包括全局时钟、复位管脚,全局输出允许管脚等,内部全局时钟网络等。
 7 B( ^" x( X2 ^" P; c. n! M9 F6 ~% W, g  k7 H2 }
 a)专用管脚和专用资源一定要优先使用,使用得好会事半功倍。如果不用器件提供的专用管脚或资源,有时导致稳定性和可靠性不高甚至是设计失败。& F9 {- m9 R$ \3 m
 . l% W0 S' s4 T
 8、逻辑未使用的但又硬件连线的管脚,逻辑必须显示声明并处理。所有有硬件连线的管脚必须在顶层代码中显示声明(包括暂时没有使用的),不允许放任不管。9 l$ S/ J/ [8 x7 [: ~& p& `! h
 : y7 P1 N( O* w6 ^1 g4 e
 a)对于有硬件连线的输入信号(包括三态的输入方向),建议输入到CPU接口作为只读寄存器(如果没CPU接口可以将该信号做成一些等效冗余逻辑加到其他逻辑中去),这样既可以消除warning,又可避免布线工具随便布线(把输出信号放到输入管脚)导致外部信号冲突;
 3 G- R& Z2 w2 N0 u; a" i0 H! Z; `4 Y, t/ {+ P( D
 b)对于有硬件连线的输出信号(包括三态的输出方向),对于暂时没有使用的一定与硬件人员确定其默认值,避免对外信号(如电阻上下拉)的干扰。
 8 i  K- e. ~; I/ @+ ]; b- p  K" J8 m7 M
 9、修改接口文档需要同对应项目组人员确认。6 }( V9 e! E& w% R# T5 _
 : j9 u# k/ r* P% z$ \' g  p2 b
 a)与硬件相关的方面涉及输入文件有qsf和sdc,内容包括但不限于电平标准、电流强度、管脚位置、输入输出方向、上下拉等等;+ n$ u9 e1 v, t0 S7 P" N
 3 h% {3 q" A/ v' f5 m
 b)与软件相关的方面涉及方案协同实现文档和寄存器接口文档,包括寄存器操作地址、操作顺序等等。# d4 ?, R) m# j* K! b
 : k0 ^3 A* Z4 U) b& c& s  ]
 二、 综合布线过程. K9 M& Y. L5 H* M; b' c1 b
 $ p: w7 y" O6 ]! X
 1、综合布线的版本是否与配置库上的版本完全一致4 T  z: G- h2 ~" |9 t& v7 w, M$ @7 ?
 5 }% S1 {' U  I8 r9 [6 g- a
 a)养成良好的版本维护和管理习惯(如复制修改和设置只读属性等),善于使用代码比较工具修改版本(包括源代码、qsf和sdc等输入文件要全部仔细比对)。% H( }5 k1 m8 @8 `7 n' n* y: b
 1 t) u- X- c( ?; I+ i6 ^) Q: P
 2、所有约束(包括对外部接口的管脚约束、时序约束、内部时序约束)是否已经添加正确,布线报告满足约束要求,时序无error类告警。. u/ h+ z6 F3 T. i' l$ V
 8 V, V+ q* L  v' P/ g0 I
 a)硬件方面:电平标准、电流强度、翻转速率以及上下拉(差分时还有输入阻抗匹配,高速信号还有预加重、VOD、接收均衡、直流增益等);
 / Z# u8 i: W, T2 V6 [( M4 Z6 Z7 J3 o0 ]! F  m0 `
 b)输入输出锁IOB/IOE,时序约束正确(Tsu、Th、Tco、Fmax);2 I  Y3 d# q% O
 
 # V/ {# ?& l# a' w: \c)异步和组合逻辑锁IOB/IOE,加set_minimum_delay和set_maximum_delay约束;) p5 c) `3 F7 G5 c
 
 & K: i) s$ B! A1 A0 ~+ `* Id)时钟约束有基时钟、衍生时钟、虚拟时钟和多周期约束等。2 i6 R+ E" }/ l( e( N
 
 4 o! `* ~, z6 z4 i3、所有编译、布线、时序分析等过程中出现的warning都已经确认。8 C8 R! D( Y" S( I: Z8 h+ `+ c
 
 " L( P5 x3 k; n5 C- Y8 j! w: F9 X三、 版本验证过程! a( W# N5 ]3 B+ F, p0 X
 
 ; F; R3 M2 `; }5 T+ R    1、修改模块必须进行UT(单元测试)。
 4 L- c  \0 G& f) C! O; b4 X( z5 e( p3 S  u
 a)建议UT的覆盖按照功能覆盖优先,分解测试点,根据测试点来设计测试用例,保证测试点覆盖率为100%;
 2 L6 K4 z2 z/ ^- n1 s/ q# U" ~; y0 m4 B0 {" v8 J- W2 ^! s, B
 b)在功能覆盖率的前提下关注代码覆盖率,建议的代码覆盖率标准为:语句覆盖和分支覆盖为100%,条件覆盖和表达式覆盖率为90%。
 7 @5 r- X7 J* ?: z
 , V: {( J! ^9 ]. V    2、有条件的话单板验证必须进行完整的STB(上板系统测试)或全系统业务平台测试。
 $ P% V  H& s, y% q
 0 Z6 T2 O$ k% T2 O9 p3 ?$ y) `) c! b良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性。0 Y( g% s6 Q! A" N' T* Z/ i
 FPGA优化方法和准则概括如下:4 f! x5 T3 K4 ?. |! F9 O
 
 a; b! p* j$ a. F一、 面积类
 ( B6 n$ U" N; c  N- q: ?' T& i8 g; `- I6 t/ n
 1、不进行不必要的数据清零。/ P* K7 `0 ~- \1 s* G) i, f
 
 3 Y( U! e; C6 ?    说明:一般在数据总线赋值额时候,习惯加上例如的:“else dout [15:0] <= 16’d0”,实际上这种清零并不是必要的,因为一般写使能就已经控制了数据的有效性,数据即使保持原值也没有问题,加入上述语句后,综合其会用多余的资源实现这个没有必要的清零分支。" K+ G. U" ^' t
 
 2 Y7 \) w( n7 g+ f' e# i9 G; E* F2、多路数据进行相同处理时,先选择后处理优于先处理后选择。
 - h5 ]) _( ~; v& ]1 w: E* q# A9 X) |
 1 h* p# }" Z, U+ y$ E( p3、采用合适的编码方式(one hot bit速度更快,但是资源消耗得也更多)。6 e+ x# p& d# T, J
 
 ' l' y+ U$ S# M3 I; u# Q4、多拍串行计算打开为一拍并行计算
 / J0 f/ [! @6 N$ y' N4 N
 . x; z  s- J" a. @  O6 E5、统计寄存器位宽根据需要来确定,不需要一位的32bit大位宽。
 ! I) v/ k4 E5 |  _, @$ c, g% W
 $ A; V2 Q. l. K" b3 D8 _9 `6、异步配置信号(CPU)可根据配置模块所在不同时钟域分别进行处理。- H# k! W4 M, [2 o* p& d/ G
 
 ' m  m0 _0 U" x+ u7、尽可能实现资源共享(计数器、比较器等),节省资源。
 . @# _6 b) z5 C" `2 E8 M& @) n# M1 `  w7 f# k3 [
 8、采用迭代算法节省资源。% L+ A" j1 z. a6 d% P8 ]
 3 Z& ?! s$ I- a- z% [
 10、使用reg代替FIFO接口。* w/ \8 ]1 }6 {& e
 $ b; h. [$ c% u7 I3 B2 x
 11、状态机状态不要在比较器中使用。  _9 k, W2 ~  y1 \5 h/ l; n
 
 + z. S3 l+ q2 v3 _5 p12、3倍插值FIR滤波器优化。9 ^- ^+ U  a! b$ m4 i
 
 ! o8 ?& s$ H' s, `7 q/ j13、用减法器借位位代替比较器。% S" B" x( {# `' v" _8 k
 - K& Q. ]7 y) U6 I
 14、利用ROM代替较大的组合逻辑。) n9 Y2 J% i) [' e# x
 3 v  C. m% ^/ o7 D7 o
 15、利用多周期约束或通过RAM换LE的方法来节省CIC滤波器LE资源。
 1 O6 c* P3 q) i7 c- X) E" O  x7 u9 ~& I
 16、Multiplexer重编码节省LUT资源。
 " z- a5 J' D, A/ ^  u& n4 t: ]# q' W
 17、合理设置MUX默认条件有利于资源优化。例如:“default:dout <= 1’dx;”
 8 E% L  M& K# W$ ?9 [0 P& \9 i
 # m7 R( {' Q+ V- r: f18、合理设置QuartusII软件中auto packed register选项
 2 L" R* r* t; \5 L
 5 C' |. @2 |3 z' ]2 u: U' {20、建议使用“减法溢出”来设计Timer。; W+ `* R# Y- H2 y0 }7 ]
 N, D3 Y& |! E1 [
 21、简化环回设计,节省资源。6 w: e: w) Y) j/ Z0 l
 $ _, E5 B" V  \4 Z0 f0 U
 22、减少时钟域,节省资源。
 7 `+ d& R  g7 Q$ y' u6 b5 q! X
 - s% J2 \% f+ M7 L, ~& I23、复数乘法公式展开,利用加法部分代替乘法。5 |' x: Q' {& d: M  o, Z2 O6 d
 ! X  E: l: _! H: a6 G
 24、禁止使用shift reg自动替换功能,避免小的的移位寄存器浪费M9K。( K# J( d( V; Z5 a: c) k2 J$ d
 
 ; b3 ~' ?9 m+ R8 q25、基于RAM的交换架构。, w/ s; ?/ ~& G* z
 " |0 j* G5 K0 C: K3 x# ~
 26、用RAM存放统计值来代替统计寄存器。0 O/ \6 ]6 ~- I( I; }+ e" z
 
 + c! b" n; g: W9 I9 Q  Q% Q28、多通道分时处理时,功能相同的模块可以考虑复用。# b/ a& }) A# b9 d+ z( d5 u! |; u
 
 & s9 p8 }5 l3 n/ B# Z7 ?9 r29、复用没有全速运行的模块,多通道RAM使用复用模块代替。
 + i7 ^' m4 ~  }7 m- p7 ]! v! c" O$ ^5 }
 RAM节省部分
 ! i; I* a( p" c) p$ x8 U
 0 Z# p! q/ z# Z5 t' s( `" O5 `1、 使用根据器件RAM块的位宽和深度合理选择。( \4 ?8 Y) Q) u: k
 
 9 h2 R3 g  J; m8 R& q& m; K9 H2、 使用分布式RAM替换寄存器资源1 O* F2 `5 d8 O2 T' ]$ n
 : w! G, x* C) O& i# [; o! g( H
 3、 2倍插值滤波器优化。8 h7 N; O' v; v1 b9 M
 
 . J; W3 N. c4 o3 D$ u! O其他部分/ k+ W( L, q- e. K" b% |$ j
 
 . \7 \: l4 I2 j, D1、 根据器件内部block RAM特点,选择合理的拼接模式,可以减小RAM块地址译码和数据选择的LE。
 ! F8 `( U$ J& t+ {
 3 g' o4 A: s, k1 r2 B9 U2 H2、 路由查表优化。: U$ U" p8 ]0 M0 _+ \( q
 
 # _+ o' D$ N. C( V二、 时序类  _0 x1 V1 b5 e- B4 K
 
 1 W$ _8 _3 q( ?# U: \/ r1、打平逻辑可以提高时序。
 ) Y2 L2 F( Q; ?# P0 V
 2 f- E5 O1 H% `. s2、配平寄存器以提高时序。( b4 U9 Y' F9 T4 {+ k! ~
 
 2 R) I3 I  g! ]' {3 n! X& Q3、尽可能减少组合逻辑。
 , U, q8 c6 L( o# M9 ~6 P
 8 B3 x* j  u8 L+ C4、在输出到IOB时安排布线时延要求低的路径,要求高的放在内部逻辑。
 / |* o0 A! C# @& E+ l  v6 o
 0 L( u: T( M+ W5 I5、降低高速时钟域布线资源。
 7 D4 d# }& H: X! ^5 n
 : X8 ]) a3 `! x/ K: x5 l& t) \6、加法时,将位宽较宽的放在多周期中,全速率中尽量减少加法位宽。7 N! i& O6 a( e1 x# A
 ( r' Z! f. {# ?" q& D- `
 7、加法时,将高位宽拆分成两级进行运算。# t' s0 ?& }, s3 `/ N% S/ ^
 
 3 }% F( E+ ?( x$ R6 G& Z3 \: V8、使用RAM、DSP中流水reg,不增加额外延时。, l% V& l1 F/ T/ ?
 / p/ @4 m3 D  v. m9 A0 Q2 R
 9、使用multicycle。
 3 V5 u& c" g: l. |3 ^9 h4 e& _- x) v; d
 10、减少扇出fanout。
 & N' V( Q% ]+ o+ X
 7 r& o: }. P/ F; o' p11、功能等价法均匀分散组合逻辑。
 / }* v8 K% Q6 }$ R  |' U" A1 }3 f
 9 b$ u) l( ~/ t- T) q% @12、设置QuartusII软件综合选项。. g0 M. x- k6 m. h, I  p
 
 - s% o7 q- I& @2 W/ ^! {# [13、功能没有优先级的if-else将关键路径放在最前。) m2 w# ]1 Q1 u! D
 
 L3 Y3 g1 w- p14、物理综合优化removal和recovery时序。7 \% C3 ~9 ?7 g1 {
 e4 T: q8 \  O1 `) L# O
 三、 功耗类
 ) Y' Z& |0 o/ T1 d4 `& I1 z0 V* V6 @1 W# X" g; T4 Q7 A
 1、避免小fanout的信号也使用全局clock网络。
 # Z! b" Z4 i) K3 i7 P# I, \5 q
 ( Q. a1 d: p. N( B7 ]4 j) D2、尽可能使用区域clock代替全局clock network。/ U" I$ S) \/ |2 ?8 s6 _
 
 : R3 d* L. U9 x. K2 c. I& e# n3、关闭非持续工作的模块时钟(通过IPCORE、clock_ctrl模块)。( d" w* u( l" l) u7 y* |" c3 j& a6 b
 2 g1 E% _" T7 Y$ V1 ^" y) R
 4、条件允许小选择低功耗管脚和设置电压电流约束。
 & c* G7 {. }0 w! K
 6 j$ d, N' T& @5、控制RAM组合形式,减少每次操作的RAM块个数。" D/ H2 I2 d& c0 S- {
 
 ! b9 X: i. q$ s! \6、代码中才用关断使能、数据等降低功耗。) N8 k# b& W4 j: x) M, [. {
 
 6 Q' s# z1 v& `" o" Z" D四、 案例类! K/ _- [9 \9 O! I% L
 
 4 s6 j; H  V& ~6 M1、减少调度模块的调度颗粒,提高系统吞吐率。! X' i  t) l: j+ l, E3 B
 ( l! M+ Z1 ^* s. ]
 2、从方案角度优化降低编码实现复杂度。: o& r( h# ]; K8 _% U7 a7 y
 6 }" k2 y# ^+ ~
 3、保证外部总线错误时,逻辑内部可以检查到。" _0 @; W. ~+ ^. {& U& q7 b$ ?
 : I- {$ J; _& v0 d
 4、多带宽滤波器实现时,可考虑使用通用混模filter实现多个不同带宽filter,以节省资源。
 % Y, K3 M+ {9 F+ V$ l# H& U% Q5 u2 Q+ a. I1 [( b/ S6 P( q! K
 五、其他( g# R9 I5 @5 _6 i. [
 
 & @+ C6 ?  H+ M$ d- @9 c1、可靠性—板级信号传递握手机制为送耦合机制。
 ) A) w+ A, L% p! m5 `/ t6 U
 | 
 |