DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1154|回复: 0
打印 上一主题 下一主题

[待整理] ASIC设计规范

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-12 19:59:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.设计必须文档化。要将设计思路,详细实现等写入文档,然后经过严格评审通过

后才能进行下一步的工作。这样做乍看起来很花时间,但是从整个项目过程来看,绝对

要比一上来就写代码要节约时间,且这种做法可以使项目处于可控、可实现的状态。



2.代码规范。

a.设计要参数化。比如一开始的设计时钟周期是30ns,复位周期是5个时钟周期,我

们可以这么写:

parameter CLK_PERIOD = 30;

parameter RST_MUL_TIME = 5;

parameter RST_TIME = RST_MUL_TIME * CLK_PERIOD;

...

rst_n = 1'b0;

# RST_TIME rst_n = 1'b1;

...

# CLK_PERIOD/2 clk <= ~clk;

如果在另一个设计中的时钟是40ns,复位周期不变,我们只需对CLK_PERIOD进行重

新例化就行了,从而使得代码更加易于重用。



b.信号命名要规范化。

1) 信号名一律小写,参数用大写。

2) 对于低电平有效的信号结尾要用_n标记,如rst_n。

3) 端口信号排列要统一,一个信号只占一行,最好按输入输出及从哪个模块来到哪

个模块去的关系排列,这样在后期仿真验证找错时后 方便很多。如:

module a(

//input

clk,

rst_n, //globle signal

wren,

rden,

avalon_din, //related to avalon bus

sdi, //related to serial port input

//output

data_ready,

avalon_dout, //related to avalon bus

...

);

4) 一个模块尽量只用一个时钟,这里的一个模块是指一个module或者是一个en

tity。在多时钟域的设计中涉及到跨时钟域的设计中最好有专门一个模块做时钟域的隔

离。这样做可以让综合器综合出更优的结果。

5) 尽量在底层模块上做逻辑,在高层尽量做例化,顶层模块只能做例化,禁止

出现任何胶连逻辑(glue logic),哪怕仅仅是对某个信号取反。理由同上。

6) 在FPGA的设计上禁止用纯组合逻辑产生latch,带D触发器的latch的是允许的

,比如配置寄存器就是这种类型。

7) 一般来说,进入FPGA的信号必须先同步,以提高系统工作频率(板级)。

所有模块的输出都要寄存器化,以提高工作频率,这对设计做到时序收敛也

是极有好处的。

9) 除非是低功耗设计,不然不要用门控时钟--这会增加设计的不稳定性,在要

用到门控时钟的地方,也要将门控信号用时钟的下降沿 打一拍再输出与时钟相与。

clk_gate_en -------- ----

-----------------|D Q |------------------|  gate_clk

_out

| | ---------| )--------

-

------o|> | | | /

clk | -------- | ----

------------------------------------

10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式

,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的

复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_

1xclk的速率发送数据。

不要这样做:

always (posedge rs232_1xclk or negedge rst_n)

begin

...

end

而要这样做:

always (posedge clk_25m or negedge rst_n)

begin

...

else if ( rs232_1xclk == 1'b1 )

...

end

11)状态机要写成3段式的(这是最标准的写法),即

...

always @(posedge clk or negedge rst_n)

...

current_state <= next_state;

...

always @ (current_state ...)

...

case(current_state)

...

s1:

if ...

next_state = s2;

...

...

always @(posedge clk or negedge rst_n)

...

else

a <= 1'b0;

c <= 1'b0;

c <= 1'b0; //赋默认值

case(current_state)

s1:

a <= 1'b0; //由于上面赋了默认值,这里就不用再对b

、c赋值了(b、c在该状态为0,不会产生锁存器,下同)

s2:

b <= 1'b1;

s3:

c <= 1'b1;

default:

...

...



3.ALTERA参考设计准则

1) Ensure Clock, Preset, and Clear configurations are free of glitch

es.

2) Never use Clocks consisting of more than one level of combinatori

al logic.

3) Carefully calculate setup times and hold times for multi-Clock sy

stems.

4) Synchronize signals between flipflops in multi-Clock systems when

the setup and hold time requirements cannot be met.

5) Ensure that Preset and Clear signals do not contain race conditio

ns.

6) Ensure that no other internal race conditions exist.

7) Register all glitch-sensitive outputs.

Synchronize all asynchronous inputs.

9) Never rely on delay chains for pin-to-pin or internal delays.

10)Do not rely on Power-On Reset. Use a master Reset pin to clear al

l flipflops.

11)Remove any stuck states from state machines or synchronous logic.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-7-22 17:25 , 耗时 0.091052 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

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