(一)蜂鸟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

本文介绍了蜂鸟E203硬件学习的第一部分,包括coding style的最佳实践,如使用标准DFF模块例化寄存器、避免if-else和case,以及模块层次划分,如e203_cpu_top模块的组成和SRAM部分。内容还涉及流水线的设计,如流水线与状态机的trade off以及反压问题的解决方案,如乒乓缓存和前向旁路缓存的应用。
最低0.47元/天 解锁文章
2137

被折叠的 条评论
为什么被折叠?



