(一)蜂鸟E203的coding style
(1)对于寄存器避免直接使用always块编写,采用模块化的标准DFF模块进行例化
例如:一个名为flg_dfflr的寄存器,除了时钟(clk)和复位信号(rst_n),还有使能信号flg_ena和输入(flg_nxt)以及输出信号(flg_r).
wire flg_nxt;
wire flg_r=~flg_nxt;
wire flg_ena=(ptr_r == (`E203_OITF_DEPTH-1)) & ptr_ena;
sirv_gnrl_dfflr #(1) flg_dfflrs(flg_ena,flg_nxt,flg_r,clk,rst_n);
使用标准DFF模块例化的优点:
- 便于全局替换寄存器类型
- 便于在寄存器中全局插入延迟
- 明确的load-enable使能信号flg_ena(方便综合工具自动插入寄存器级别的门控时钟以降低动态功耗)
- 便于规避verilog语法中if-else不能传播不定态的问题
在general文件夹中包含一个sirv_gnrl_xchecker.v文件(正是检查是否有不定态传播,一旦输入的i_dat出现不定态,报错并终止仿真)
(2)使用assign语法替代if-else 和case语句
- 不能传播不定态(但是目前本人使用的EDA软件VCS是不存在这个问题的;传播不定态,可以在仿真阶段将bug彻底暴露出来)
- 产生优先级的选择电路而非并行选择电路
如果确实希望生成一种优先级选择的逻辑
assign out