很高兴大家来能够到这里一起与我共同学习进步!!!!
cpld,fpga设计时大家要注意coding规范
上一篇 / 下一篇 2006-10-26 19:10:48 / 天气: 晴朗 / 心情: 高兴
cpld,fpga设计时大家要注意coding规范,的确很重要 EDA中国门户网站
Q
F V6WHTcE(r?
工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。EDA中国门户网站D:A'{ Ar"M1F H:h
EDA中国门户网站W*g'q b7q2}fd!M:I
在逻辑方面,我觉得比较重要的规范有这些:
*|iN@0t7y2R]0EDA中国门户网站tYi5J1O}
1.设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。EDA中国门户网站o'b*x"nE&Zv"?/E
EDA中国门户网站#U y-Ds'Gi6T
2.代码规范。
u UEBCi$l0 a.设计要参数化。比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我们可以这么写:
y8z tr-K^(iS X0 parameter CLK_PERIOD = 30;EDA中国门户网站j-kA)p&BOPIh
parameter RST_MUL_TIME = 5;EDA中国门户网站'E7P&{Qb sY1w8}9J
parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;EDA中国门户网站qQ,l8qC3|1zdf2rN3U
...EDA中国门户网站 |fu0O{V/Uj
rst_n = 1'b0;EDA中国门户网站O3h:n4c7yL[
# RST_TIME rst_n = 1'b1;EDA中国门户网站1{+H Mtv w1^Uv
...EDA中国门户网站F^2G6@S1J
# CLK_PERIOD/2 clk <= ~clk;
8f3wu-X~ n/~;s0 如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重新例化就行了,从而使得代码更加易于重用。
#{d7zta0EDA中国门户网站!f2~7m\zK']5A&o
b.信号命名要规范化。EDA中国门户网站?i DHg+w
1) 信号名一律小写,参数用大写。EDA中国门户网站3k/gvWSML9fY
2) 对于低电平有效的信号结尾要用_n标记,如rst_n。
ak:U7v5aJZd0 3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪个模块去的关系排列,这样在后期仿真验证找错时后 方便很多。如:EDA中国门户网站)}f ef~J0H3X5s
module a(EDA中国门户网站3uVEA+o
//input
I.Hh$yl0 clk,EDA中国门户网站em;@?!Xax^[9}
rst_n, //globle signalEDA中国门户网站pU*b$sY"R
wren,EDA中国门户网站&u@u.o;O
rden,EDA中国门户网站4f'z(k6E'z!K
avalon_din, //related to avalon busEDA中国门户网站 {~ c]hb%M
sdi, //related to serial port inputEDA中国门户网站5K-`Z#Ej]D`oL,J
//output
#r,B0K3I [ z0 data_ready,EDA中国门户网站^*CP1S&o7IW
avalon_dout, //related to avalon busEDA中国门户网站ry@#T;K[6cN(tG
...
@E~ S.~ C:T0 );EDA中国门户网站S.F:[,R\_X c(f;c
4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个entity。在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔离。这样做可以让综合器综合出更优的结果。EDA中国门户网站SO3{wP)Tk+M~.a#U
5) 尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止出现任何胶连逻辑(glue logic),哪怕仅仅是对某个信号取反。理由同上。
2l} _6T Y6su0 6) 在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的,比如配置寄存器就是这种类型。
J)ex7H2f,_0p1a-\0 7) 一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。
/w5`WUWp9s(m4T0
%p6AGs7o Ha#A0 所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也
?%Q#yr|#?R%Ca:h0是极有好处的。
j-yf8eTB0EDA中国门户网站BC `|[ u
9) 除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要用到门控时钟的地方,也要将门控信号用时钟的下降沿 打一拍再输出与时钟相与。EDA中国门户网站"}8}7Z zu\)e/iw
clk_gate_en -------- ----EDA中国门户网站n ~9n E CR wwA%g
-----------------|D Q |------------------| \ gate_clkEDA中国门户网站X/h;v2S0Z.gz E
_outEDA中国门户网站*Tr7wkza5G
| | ---------| )--------EDA中国门户网站 |D dzpXC/J
-
|#M%Nl%Vf}0 ------o|> | | | /EDA中国门户网站 `,M(~JD
clk | -------- | ----EDA中国门户网站t e9Z$t[ C'F
------------------------------------
_UJ}zx q0 10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_1xclk的速率发送数据。EDA中国门户网站"K0P8fn1n `$W
不要这样做:EDA中国门户网站 C@.FB8COd"Zu3V
always (posedge rs232_1xclk or negedge rst_n)
S[S`KG0kH)C0 beginEDA中国门户网站&k u_ yXEGs;?;` Q
...EDA中国门户网站)`]4i`+h R
end
^8bw%?sJ Sb YUfX0 而要这样做:EDA中国门户网站#s1I.ONVm(D
always (posedge clk_25m or negedge rst_n)EDA中国门户网站'C1[ N6]-b7RT6Q*bf
begin
$L WZ+Z:PNw0 ...EDA中国门户网站Y&`.tv)e$?6Jv
else if ( rs232_1xclk == 1'b1 )
:V SB){%[+Nr0 ...
~Aw!uJtsB3^u g&K0 endEDA中国门户网站6u(x \5N"Ir
11)状态机要写成3段式的(这是最标准的写法),即EDA中国门户网站p4s0iK,?
...
^5a6N&D&_/r0 always @(posedge clk or negedge rst_n)EDA中国门户网站i7ATXM'\
...
M2Z.eM5}{1m0 current_state <= next_state;
9Pq8q}1Bz0 ...
!^q9m K%f5uk8x] pu0 always @ (current_state ...)EDA中国门户网站?(K8obmU6s
...
LJ*v~E8Nx4l2z0 case(current_state)EDA中国门户网站3K#[9X7O{'@)R+^8f
...EDA中国门户网站#Q0?ezmix
s1:EDA中国门户网站A9I y&Lt\6A!aI
if ...EDA中国门户网站xS"T;l`2W"h8w#e
next_state = s2;
Tk]7f7GN0 ...EDA中国门户网站 X"~-i*p.YW:|
...EDA中国门户网站%U!@0xtr$uS#k'["~
always @(posedge clk or negedge rst_n)EDA中国门户网站e,V T!I| } ~3TB+Wc
...
rS*I1WG8N)u0 else
_H\ b K4}0 a <= 1'b0;
$x M&uV5],En0 c <= 1'b0;EDA中国门户网站H7x3nMT0E/i,T
c <= 1'b0; //赋默认值
$|U/PIV0 case(current_state)EDA中国门户网站3R'bMGVX;[xN4S
s1:
`;f1T c+tD)R0 a <= 1'b0; //由于上面赋了默认值,这里就不用再对b
:B-\%n.T8D0、c赋值了
yz fn|`qA0 s2:EDA中国门户网站2Og7_+t6ES6a)X,Gu fI
b <= 1'b1;EDA中国门户网站%x\{.['BO*CuZ+J8h
s3:
6zNG{8jp'@8f0 c <= 1'b1;EDA中国门户网站XO-N {(K
default:
/q|J j%mZ0 ...EDA中国门户网站i1|d2b.E
...
&X4r#p!f.l%z-s_0EDA中国门户网站'ji3\D)IS?+gT
3.ALTERA参考设计准则
9W6vIb n,F]0 1) Ensure Clock, Preset, and Clear configurations are free of glitch
k:`[_kh0es.EDA中国门户网站z8B!C pQq
2) Never use Clocks consisting of more than one level of combinatori
8_0y?+g!gS0al logic.EDA中国门户网站4N3^Ac!O.b3F^3L
3) Carefully calculate setup times and hold times for multi-Clock sy
&F7p1J!J0\4f0stems.EDA中国门户网站2n{#|y(\ o!x)? Iz/V
4) Synchronize signals between flipflops in multi-Clock systems whenEDA中国门户网站t MTLlb:Q
the setup and hold time requirements cannot be met.EDA中国门户网站Oh"i2y,^j3A
5) Ensure that Preset and Clear signals do not contain race conditio
m6dr&l:|;[1G0ns.
7fl#z;t~nrA0 6) Ensure that no other internal race conditions exist.
3`AqDF8J;z0 7) Register all glitch-sensitive outputs.
&b(}w Bvr/P,Vr_N0 Synchronize all asynchronous inputs.EDA中国门户网站;b1Pn ~i"G^'N%l
9) Never rely on delay chains for pin-to-pin or internal delays.EDA中国门户网站c Q HW2MVN
10)Do not rely on Power-On Reset. Use a master Reset pin to clear alEDA中国门户网站p3~#spihW9O
l flipflops.
N$m#b_yB0 11)Remove any stuck states from state machines or synchronous logic.EDA中国门户网站+FH"j.w6r%W
EDA中国门户网站E0B,T#P{U$[V
QQ:51877597
V"C?g.H!Z!e0
工作过的朋友肯定知道,公司里是很强调规范的,特别是对于大的设计(无论软件还是硬件),不按照规范走几乎是不可实现的。逻辑设计也是这样:如果不按规范做的话,过一个月后调试时发现有错,回头再看自己写的代码,估计很多信号功能都忘了,更不要说检错了;如果一个项目做了一半一个人走了,接班的估计得从头开始设计;如果需要在原来的版本基础上增加新功能,很可能也得从头来过,很难做到设计的可重用性。EDA中国门户网站D:A'{ Ar"M1F H:h
EDA中国门户网站W*g'q b7q2}fd!M:I
在逻辑方面,我觉得比较重要的规范有这些:
*|iN@0t7y2R]0EDA中国门户网站tYi5J1O}
1.设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。EDA中国门户网站o'b*x"nE&Zv"?/E
EDA中国门户网站#U y-Ds'Gi6T
2.代码规范。
u UEBCi$l0 a.设计要参数化。比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我们可以这么写:
y8z tr-K^(iS X0 parameter CLK_PERIOD = 30;EDA中国门户网站j-kA)p&BOPIh
parameter RST_MUL_TIME = 5;EDA中国门户网站'E7P&{Qb sY1w8}9J
parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;EDA中国门户网站qQ,l8qC3|1zdf2rN3U
...EDA中国门户网站 |fu0O{V/Uj
rst_n = 1'b0;EDA中国门户网站O3h:n4c7yL[
# RST_TIME rst_n = 1'b1;EDA中国门户网站1{+H Mtv w1^Uv
...EDA中国门户网站F^2G6@S1J
# CLK_PERIOD/2 clk <= ~clk;
8f3wu-X~ n/~;s0 如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重新例化就行了,从而使得代码更加易于重用。
#{d7zta0EDA中国门户网站!f2~7m\zK']5A&o
b.信号命名要规范化。EDA中国门户网站?i DHg+w
1) 信号名一律小写,参数用大写。EDA中国门户网站3k/gvWSML9fY
2) 对于低电平有效的信号结尾要用_n标记,如rst_n。
ak:U7v5aJZd0 3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪个模块去的关系排列,这样在后期仿真验证找错时后 方便很多。如:EDA中国门户网站)}f ef~J0H3X5s
module a(EDA中国门户网站3uVEA+o
//input
I.Hh$yl0 clk,EDA中国门户网站em;@?!Xax^[9}
rst_n, //globle signalEDA中国门户网站pU*b$sY"R
wren,EDA中国门户网站&u@u.o;O
rden,EDA中国门户网站4f'z(k6E'z!K
avalon_din, //related to avalon busEDA中国门户网站 {~ c]hb%M
sdi, //related to serial port inputEDA中国门户网站5K-`Z#Ej]D`oL,J
//output
#r,B0K3I [ z0 data_ready,EDA中国门户网站^*CP1S&o7IW
avalon_dout, //related to avalon busEDA中国门户网站ry@#T;K[6cN(tG
...
@E~ S.~ C:T0 );EDA中国门户网站S.F:[,R\_X c(f;c
4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个entity。在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔离。这样做可以让综合器综合出更优的结果。EDA中国门户网站SO3{wP)Tk+M~.a#U
5) 尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止出现任何胶连逻辑(glue logic),哪怕仅仅是对某个信号取反。理由同上。
2l} _6T Y6su0 6) 在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的,比如配置寄存器就是这种类型。
J)ex7H2f,_0p1a-\0 7) 一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。
/w5`WUWp9s(m4T0
%p6AGs7o Ha#A0 所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也
?%Q#yr|#?R%Ca:h0是极有好处的。
j-yf8eTB0EDA中国门户网站BC `|[ u
9) 除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要用到门控时钟的地方,也要将门控信号用时钟的下降沿 打一拍再输出与时钟相与。EDA中国门户网站"}8}7Z zu\)e/iw
clk_gate_en -------- ----EDA中国门户网站n ~9n E CR wwA%g
-----------------|D Q |------------------| \ gate_clkEDA中国门户网站X/h;v2S0Z.gz E
_outEDA中国门户网站*Tr7wkza5G
| | ---------| )--------EDA中国门户网站 |D dzpXC/J
-
|#M%Nl%Vf}0 ------o|> | | | /EDA中国门户网站 `,M(~JD
clk | -------- | ----EDA中国门户网站t e9Z$t[ C'F
------------------------------------
_UJ}zx q0 10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_1xclk的速率发送数据。EDA中国门户网站"K0P8fn1n `$W
不要这样做:EDA中国门户网站 C@.FB8COd"Zu3V
always (posedge rs232_1xclk or negedge rst_n)
S[S`KG0kH)C0 beginEDA中国门户网站&k u_ yXEGs;?;` Q
...EDA中国门户网站)`]4i`+h R
end
^8bw%?sJ Sb YUfX0 而要这样做:EDA中国门户网站#s1I.ONVm(D
always (posedge clk_25m or negedge rst_n)EDA中国门户网站'C1[ N6]-b7RT6Q*bf
begin
$L WZ+Z:PNw0 ...EDA中国门户网站Y&`.tv)e$?6Jv
else if ( rs232_1xclk == 1'b1 )
:V SB){%[+Nr0 ...
~Aw!uJtsB3^u g&K0 endEDA中国门户网站6u(x \5N"Ir
11)状态机要写成3段式的(这是最标准的写法),即EDA中国门户网站p4s0iK,?
...
^5a6N&D&_/r0 always @(posedge clk or negedge rst_n)EDA中国门户网站i7ATXM'\
...
M2Z.eM5}{1m0 current_state <= next_state;
9Pq8q}1Bz0 ...
!^q9m K%f5uk8x] pu0 always @ (current_state ...)EDA中国门户网站?(K8obmU6s
...
LJ*v~E8Nx4l2z0 case(current_state)EDA中国门户网站3K#[9X7O{'@)R+^8f
...EDA中国门户网站#Q0?ezmix
s1:EDA中国门户网站A9I y&Lt\6A!aI
if ...EDA中国门户网站xS"T;l`2W"h8w#e
next_state = s2;
Tk]7f7GN0 ...EDA中国门户网站 X"~-i*p.YW:|
...EDA中国门户网站%U!@0xtr$uS#k'["~
always @(posedge clk or negedge rst_n)EDA中国门户网站e,V T!I| } ~3TB+Wc
...
rS*I1WG8N)u0 else
_H\ b K4}0 a <= 1'b0;
$x M&uV5],En0 c <= 1'b0;EDA中国门户网站H7x3nMT0E/i,T
c <= 1'b0; //赋默认值
$|U/PIV0 case(current_state)EDA中国门户网站3R'bMGVX;[xN4S
s1:
`;f1T c+tD)R0 a <= 1'b0; //由于上面赋了默认值,这里就不用再对b
:B-\%n.T8D0、c赋值了
yz fn|`qA0 s2:EDA中国门户网站2Og7_+t6ES6a)X,Gu fI
b <= 1'b1;EDA中国门户网站%x\{.['BO*CuZ+J8h
s3:
6zNG{8jp'@8f0 c <= 1'b1;EDA中国门户网站XO-N {(K
default:
/q|J j%mZ0 ...EDA中国门户网站i1|d2b.E
...
&X4r#p!f.l%z-s_0EDA中国门户网站'ji3\D)IS?+gT
3.ALTERA参考设计准则
9W6vIb n,F]0 1) Ensure Clock, Preset, and Clear configurations are free of glitch
k:`[_kh0es.EDA中国门户网站z8B!C pQq
2) Never use Clocks consisting of more than one level of combinatori
8_0y?+g!gS0al logic.EDA中国门户网站4N3^Ac!O.b3F^3L
3) Carefully calculate setup times and hold times for multi-Clock sy
&F7p1J!J0\4f0stems.EDA中国门户网站2n{#|y(\ o!x)? Iz/V
4) Synchronize signals between flipflops in multi-Clock systems whenEDA中国门户网站t MTLlb:Q
the setup and hold time requirements cannot be met.EDA中国门户网站Oh"i2y,^j3A
5) Ensure that Preset and Clear signals do not contain race conditio
m6dr&l:|;[1G0ns.
7fl#z;t~nrA0 6) Ensure that no other internal race conditions exist.
3`AqDF8J;z0 7) Register all glitch-sensitive outputs.
&b(}w Bvr/P,Vr_N0 Synchronize all asynchronous inputs.EDA中国门户网站;b1Pn ~i"G^'N%l
9) Never rely on delay chains for pin-to-pin or internal delays.EDA中国门户网站c Q HW2MVN
10)Do not rely on Power-On Reset. Use a master Reset pin to clear alEDA中国门户网站p3~#spihW9O
l flipflops.
N$m#b_yB0 11)Remove any stuck states from state machines or synchronous logic.EDA中国门户网站+FH"j.w6r%W
EDA中国门户网站E0B,T#P{U$[V
QQ:51877597
V"C?g.H!Z!e0
TAG:
我的栏目
标题搜索
日历
|
|||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | 5 | 6 | ||||
| 7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
| 14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
| 21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
| 28 | 29 | 30 | 31 | ||||||
我的存档
数据统计
- 访问量: 10432
- 日志数: 42
- 文件数: 10
- 建立时间: 2006-10-20
- 更新时间: 2008-04-02



