⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdl编码风格与编码指南.txt

📁 大家好没办法还是那句话 我现在用maxplus2有高手跟我联系请上qq94229631 手机13788910703上海的我姓曹
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  ·尽可能使用类书参数说明(Generic)。
  ·尽量多定义常数,这样可以增加代码的可读性。
  ·写代码之前,要先画出系统框图,对自己要做的
  模块有一个清楚的认识,这样可以减少你写代码时间,提高效率。
   
   
  第三部分:HDL编码指导
  1.复位
  1.1 作用
  复位使初始状态可预测,防止出现禁用状态。
   
  1.2 推荐:
  ·FPGA和CPLD的复位信号采用异步低电平有效信号,
  连接到其全局复位输入端,使用专用路径通道。
  FPGA和CPLD有固定时间延迟线,连接到所有资源上。 
  ·对于目标器件为ASIC的core,异步时钟只能局部使用,
  在顶层设计上要与时钟同步,这可以防止过长的延时。
  ·复位时,所有双向端口要处于输入状态。
   
  1.3 强烈推荐:
  复位信号必须连接到FPGA和CPLD的全局复位管脚。
  这是由于这些管脚提供较低的抖动。
   
  2.时钟
  2.1 好的习惯:
  在core中尽可使用小的时钟域。
  2.2 推荐:
  ·信号穿过时钟的两半个周期时,要在前后分别取样;
  防止出现半稳定状态。
  ·不要用时钟或复位信号作数据或使能信号,也不能用
  数据信号作为时钟或复位信号;
  HDL综合时会出现时序验证问题。
  ·不要使用门时钟(don't use gated clock)。
  2.3 强烈推荐:
  时钟信号必须连接到全局时钟管脚上。
   
  3.总线
  推荐:
  ·总线要从0位开始;
  有些工具不支持不从0位开始的总线。
  ·从高位到低位;
  这样可以避免在不同设计层上产生误解。
   
  4.通用规则
  4.1 强烈推荐:
  不要使用内部三态信号,否则增加功耗。
  这样使后端的调整更困难。
   
  4.2 同步设计和时序优化
  4.2.1强烈推荐:
  ·只使用同步设计;
  这样可以避免在综合、时序验证和仿真中的出现的一些问题。
  ·不要使用延时单元; ·所有块的外部IO必须注册;
  这样可以避免较长的路径延时
  4.2.2 推荐:
  ·避免使用锁存器;
  这样会产生综合和时序验证问题。
  ·避免使用负延触发的双稳态多谐振荡器(flip flop)。
  同样会产生综合和时序验证问题。
  4.2.3 好的习惯:
  块内部IO要例化。
  这是设计问题,在大部分情况下推荐使用
   
  5.verilog编码指导原则
  5.1 一般规则
  5.1.1 强烈推荐:
  在时钟驱动的同步进程中不要使用block结构,block结构
  应用于异步进程种。
  Synopsys 希望使用这种格式,有确定的仿真响应。
  5.1.2 推荐:
  ·尽量使用无路径的“include”命令行;
  HDL应当与环境无关。
  ·避免使用“ifdef”命令,尽量用一个全局定义文件
  做所有的定义;
  否则容易产生版本和编辑问题
  5.1.3 好的习惯:
  ·尽量在一个文件中只用一个模块,文件名要和
  模块名相同;
  ·尽量在例化中使用名称符号,不要用位置符号;
  有利于调试和增加代码的易读性。
  ·在不同的层级上使用统一的信号名;
  容易跟踪信号,网表调试也容易。
  ·比较总线时要有相同的宽度。
  否则其它位的值不可预测。
   
  5.2 仿真和调试
  5.2.1 强烈推荐:
  全部的系统仿真任务都应在Synopsys命令“synopsys translate on/off”之中。
  5.2.2 好的习惯:
  ·在全局定义文件中,在开始的时间标度命令中写
  “timescale 1n/10p”;
  不同的“timescale”会导致仿真问题--竞争和过长的路径
  ·尽量在“display”命令中使用“%m”(显示实例名)。
   
  6.VHDL 代码指导原则
  6.1 一般规则
  6.1.1 强烈推荐:
  ·外部端口用std_logic类型;
  ·不要赋未知值“x”或检查验证无效的“-”;
  这些值在仿真和综合时会产生不可预测的行为。
  ·不要使用信号和变量的默认值(或初始值),用复位脉冲初始化
  信号和变量。
  会在仿真和综合时出现不匹配。
  6.1.2 好的习惯:
  ·在整个VHDL工程中不要混用编码准则(i.e. VHDL 87 and VHDL 93);
  ·尽量在一个VHDL文件中做一个设计,文件名要和结构名一致;
  ·尽量在模块例化中使用名称符号,不要用位置符号;
  有利于调试和增加代码的易读性。
  例如:
  wb_if: wb
  PORT MAP (
    CLK => CLK_i,
    RST_I => RST_I_i,
    ACK_O => ACK_O_i,
    ADR_I => ADR_I_i,
    CYC_I => CYC_I_i,
    DAT_I => DAT_I_i,
    DAT_O => DAT_O_i,
    RTY_O => RTY_O_i,
    STB_I => STB_I_i,
    WE_I => WE_I_i);
  6.1.3 好的习惯:
  ·在不同的层级上使用统一的信号名;
  容易跟踪信号,网表调试也容易。
  ·尽量用配置(configuration)映射实体、结构体和模块;
  改变不同的结构体只要简单改动一个文件就可以了,这在仿真上很有用,
  能从高层上改变低层结构体。
  ·尽量在分开的库中编译每个块;
  ·使用常量和类属说明定义缓冲大小,总线宽度和其它单元参数。
  这可增强可读性和代码复用性。
  6.1.4 推荐:
  ·在一个最小化的包中定义模块和常量。
  6.1.5 强烈推荐:
  ·不要在代码中使用buffer类型的端口读取输出数据;要使用out类型,
  再增加另外变量或信号,以获取输出值。
  这是因为buffer类型的端口不能连接到其他类型的端口上,
  因此buffer类型就会在整个设计的端口中传播下去。
  例如:
  PROCESS (CLK, RST_n)
    variable out_var : std_logic;
  BEGIN -- PROCESS
    IF RST_n = '0' THEN
      Outsignal <= '0';
      out_var <'0';
      outsign2 <= '0';
    ELSIF CLK'event AND CLK = '1' THEN
      Outsign2 <= out_var; -- the same as Outsignal
      out_var := input1 and input2;
      Outsignal <= input1 and input2;
    END IF;
  END PROCESS;
   
  6.2 可综合编码
  6.2.1 好的习惯:
  尽量使用FSM,一个在时序逻辑中,一个在组合逻辑中。
  这可增加可读性和预测组合逻辑的大小
  6.2.2 推荐:
  尽量在一个单独的时钟进程中写时钟使能,而不要在两个不同的进程中使用,
  一个是时钟驱动的,一个是组合逻辑,如下例所示。
  这是因为有些综合工具检查CE操作,若存在,就将其映射到触发器的CE端,
  否则,CE管脚不被使用,隐含使用外部逻辑。这是fpga设计的一般习惯。
  PROCESS (CLK, RST_n)
  BEGIN -- PROCESS
    IF RST_n = '0' THEN
      Outsignal <= '0';
    ELSIF CLK'event AND CLK = '1' THEN
      IF (CE = '1') THEN
        Outsignal <= '1';
      END IF;
    END IF;
  END PROCESS;
   
  6.2.3 强烈推荐:
  ·对变量要先读后写;
  如果先写后读,就会产生长的组合逻辑和锁存器(或寄存器)。这是因为变量值是立即获取的。
  PROCESS (CLK, RST_n)
    Variable out_var : std_logic;
  BEGIN -- PROCESS
    IF RST_n = '0' THEN
      out_var <'0';
      outsign2 <= '0';
    ELSIF CLK'event AND CLK = '1' THEN
      Outsign2 <= out_var; -- read
      out_var := input1 and input2; -- write
    END IF;
  END PROCESS;
  ·在组合逻辑进程中,其敏感向量标中要包含所有要读取得信号;
  这是为了防止出现不必要的锁存器。
  ·避免使用长的if-then-else语句,而使用case语句来代替;
  防止出现较大的优先编码器,使得代码比较容易读懂。
   
  6.3 以仿真和调试为目的的编码
  6.3.1 好的习惯:
  尽量使用两部分的test bench,一部分作为数据产生和检验,
  另一部分作为时序总线接口协议的产生和检验。
  这是为了从总线握手中分离数据(结果检验),为了使操作简单--改变
  总线握手协议而同时保持内部逻辑不变。

   
   
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -