HDL编码风格与编码指南

作者: 佚名   发布日期:2005-12-24 10:39   查看数:152   出自:互联网


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,一部分作为数据产生和检验,
另一部分作为时序总线接口协议的产生和检验。
这是为了从总线握手中分离数据(结果检验),为了使操作简单--改变
总线握手协议而同时保持内部逻辑不变。
第1页第2页第3页
相关文章(最新&最热)