分享

1、FPGA -----Veriolg规范

 ruguoyouyuan 2014-02-19
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.
六大黄金准则:
1. 系统级信号的命名。

系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号;系统信号以字符串Sys开头。

2. 低电平有效的信号后一律加下划线和字母n。

如:SysRst_n;FifoFull_n;

3. 经过锁存器锁存后的信号,后加下划线和字母r,与锁存前的信号区别。如CpuRamRd信号,经锁存后应命名为CpuRamRd_r。低电平有效的信号经过锁存器锁存后,其命名应在_n后加r。

如CpuRamRd_n信号,经锁存后应命名为CpuRamRd_nr多级锁存的信号,可多加r以标明。如CpuRamRd信号,经两级触发器锁存后,应命名为CpuRamRd_rr。
Z
4. 模块的命名。

在系统设计阶段应该为每个模块进行命名。命名的方法是,将模块英文名称的各个单词首字母组合起来,形成3到5个字符的缩写。若模块的英文名只有一个单词,可取该单词的前3个字母。各模块的命名以3个字母为宜。例如:Arithmatic Logical Unit模块,命名为ALU。Data Memory Interface模块,命名为DMI。Decoder模块,命名为DEC。

5. 模块之间的接口信号的命名。

所有变量命名分为两个部分,第一部分表明数据方向,其中数据发出方在前,数据接收方在后,第二部分为数据名称。两部分之间用下划线隔离开。第一部分全部大写,第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写。

举例:CPUMMU_WrReq,下划线左边是第一部分,代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。下划线右边Wr为Write的缩写,Req是Request的缩写。两个缩写的第一个字母都大写,便于理解。整个变量连起来的意思就是CPU发送给MMU的写请求信号。模块上下层次间信号的命名也遵循本规定。若某个信号从一个模块传递到多个模块,其命名应视信号的主要路径而定。

6. 模块内部信号:

模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义;单词除常用的缩写方法外(如:Clock-》Clk, Write-》Wr, Read-》Rd等),一律取该单词的前几个字母( 如:Frequency-》Freq, Variable-》Var 等);每个缩写单词的第一个字母大写;若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr); 举例:SdramWrEn_n;FlashAddrLatchEn.

2.1 编程风格(Coding Style)要求

2.1.1 文件

(1)       每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模块名相同。

(2)       每个设计文件开头应包含如下注释内容:

l  年份及公司名称。

l  作者。

l  文件名。

l  所属项目。

l  顶层模块。

l  模块名称及其描述。

l  修改纪录。

请参考标准示例程序[3]

2.1.2 大小写

(1)       如无特别需要,模块名和信号名一律采用小写字母。

(2)       为醒目起见,常数(`define定义)/参数(parameter定义)采用大写字母。

2.1.3 标识符

(1)       标识符采用传统C语言的命名方法,即在单词之间以“_”分开,如:max_delaydata_size等等。

(2)       采用有意义的、能反映对象特征、作用和性质的单词命名标识符,以增强程序的可读性。

(3)       为避免标识符过于冗长,对较长单词的应当采用适当的缩写形式,如用‘buff’代替‘buffer’,‘ena’代替‘enable’,‘addr’代替‘address’等。

2.1.4 参数化设计

       为了源代码的可读性和可移植性起见,不要在程序中直接写特定数值,尽可能采用`define语句或paramater语句定义常数或参数。

2.1.5 空行和空格

(1)       适当地在代码的不同部分中插入空行,避免因程序拥挤不利阅读。

(2)       在表达式中插入空格,避免代码拥挤,包括:

赋值符号两边要有空格;

双目运算符两边要有空格;

单目运算符和操作数之间可没有空格,

示例如下:

a  <=  b;

c  <=  a  +  b;

if (a  ==  b) then ...

a  <=  ~a  &  c;

2.1.6 对齐和缩进

(1)       不要使用连续的空格来进行语句的对齐。

(2)       采用制表符Tab对语句对齐和缩进,Tab键采用4个字符宽度,可在编辑器中设置。

(3)       各种嵌套语句尤其是if...else语句,必须严格的逐层缩进对齐。

2.1.7 注释

必须加入详细、清晰的注释行以增强代码的可读性和可移植性,注释内容占代码篇幅不应少于30%

2.1.8 参考C语言的资料

       要形成良好的编程风格,有许多细节需要注意,可以参考资料[4],虽然它是针对C语言的讨论,但由于Verilog HDLC语言的形式非常近似,所以里面提到的很多原则都是可以借鉴的。

2.1.9 可视化设计方法

       为提高设计效率和适应协同设计的方式,可采用可视化的设计方法,Mentor GrahpicsRenoir软件提供了非常好的设计模式。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多