RISC-V - 蜂鸟E203-设计观念

602 阅读5分钟

ICTM:指令紧耦合存储器 DCTM:数据紧耦合存储器。 可实现指令和数据的分离存储,并提高性能。

处理器硬件设计

设计理念

1 模块化和可重用性

将处理器划分为几个主体模块单元,每个单元之间的接口简单清晰。

2 面积最小化

尽可能复用数据通路以节省面积开销,当存在时序和面积冲突时,面积优先的策略。

3 结构简单化

4 性能不追求极致

虽然它追求性能最大化,但须以面积最小化和结构简单化为前提,在性能上够用即可。

RTL代码风格

寄存器的存储电路是由锁存器或触发器构成

使用标准DFF模块例化,生成寄存器。

推荐使用Verilog中的assign语法替代if else和case语法。

使用标准DFF模块例化生成寄存器。

寄存器是数字同步电路中基本的单元,最常见用always块语法生成寄存器,E203避免直接使用always块编写,而采用模块化的标准DFF模块进行例化。

复位信号rst_n,时钟clk,使能信号flg_ena,输入flg_nxt,输出信号flg_r。

用#号和defpara关键字实现Verilog实例化时的参数传递

module_name #( parameter1, parameter2) inst_name( port_map);

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);

例化的方式实现寄存器,而不是显示的always块。

使用标准DFF模块例化生成寄存器:

便于全局替换寄存器类型

便于在寄存器中全局插入延迟

明确的load-enable使能信号flg_ena(方便综合工具自动插入寄存器级别的门控时钟以降低动态功耗)

便于规避verilog语法中if-else不能传播不定态的问题

有一系列DFF模块:

带load_enadble使能信号,latch模块等等

sirv_gnrl_dfflr:带load_enadble使能信号、带异步reset信号、复位默认值为0的寄存器。

  parameter DW = 32
) (

  input               lden, 
  input      [DW-1:0] dnxt,
  output     [DW-1:0] qout,

  input               clk,
  input               rst_n
);

reg [DW-1:0] qout_r;
// 使用always块编写寄存器逻辑
always @(posedge clk or negedge rst_n)
begin : DFFLRS_PROC
  if (rst_n == 1'b0)
    qout_r <= {DW{1'b1}};
  else if (lden == 1'b1)
    qout_r <= #1 dnxt;
end

assign qout = qout_r;
// 使用assertion捕捉lden信号的不定态
`ifndef FPGA_SOURCE//{
`ifndef DISABLE_SV_ASSERTION//{
//synopsys translate_off
sirv_gnrl_xchecker # (
  .DW(1)
) sirv_gnrl_xchecker(
  .i_dat(lden),
  .clk  (clk)
);
//synopsys translate_on
`endif//}
`endif//}
    
endmodule

由于if else不能传播不定态,因此对于if条件中lden信号为不定态的非法情况使用断言进行捕捉。 使用assertion捕捉lden信号的不定态

推荐使用assign语法替代if lse和case

if else 和case的缺点:

不能传播不定态
会产生优先级的选择电路而非并行选择电路,从而不利于优化时序和面积。
   else out =in2;

假设a为X不定态,按照Verilog语法,将等效于a=0,从而输出值等于in2,而没有将不定态X传输出去,这种情况在仿真阶段会掩盖某些致命的bug。

然而使用assign,如果a的值等于x,则out的值也会等于x,可以在仿真阶段暴露出bug。

Verilog的if-else语句和case语句存在会被综合为优先级选择的电路。

如果确实想生成一个有优先级选择的电路可以推荐使用assign语法等效编写成如下形式,以运行不定态x的传播
如果想要生成并行选择的逻辑,推荐使用与 或逻辑实现

使用明确的assign语法编写的与或 逻辑一定能保证综合成并行选择的电路。

其他若干注意事项

由于带reset信号的寄存器面积略大,时序稍微差点,因此在数据通路上可以使用不带reset的寄存器,而只在控制通路上使用带reset信号的寄存器。

信号名尽量使用拼音,英文缩写。

clock和reset只能接入DFF,作为其时钟和复位信号。

蜂鸟E203核推荐使用assign语法核DFF例化方法可以使得任何不定态在前仿真阶段无处遁形。

顶层模块层次划分

TCM=Tightly Coupled Memory,是一种高速缓存,被直接集成在CPU芯片中。DS有两种TCM,分别是ITCM(Instruction TCM)和DTCM(Data TCM)。

顶层e203_cpu_top例化两个模块e203_cpu和e203_srams

e203_cpu:为处理器核的所有逻辑部分
e203_srams:为处理器核的所有SRAM部分,ITCM核DTCM的SRAM。将SRAM和逻辑部分在层次上分开方便实现ASIC。

e203_cpu:

  • e203_clk_ctrl:用于控制处理器主要组件的自动时钟门控

  • e203_irq_sync:用于将外界的异步中断信号进行同步

  • e203_itcm_ctrl 和 e203_dtcm_ctrl用于控制ITCM和DTCM的访问

  • e203_reset_ctrl:将外界的异步reset信号进行同步使之变成“异步置位同步释放”的复位信号

逻辑顶层e203_cpu模块例化的e203_core则是处理器核的主体部分,实现了处理器核的主要功能。

e203_core:

(1)e203_ifu:取指令单元(取指令以及生成PC)

(2)e203_exu:执行单元(完成执行、存储操作,并提交写回)

(3)e203_lsu:存储器访问单元

(4)e203_biu:总线接口单元(在蜂鸟E203中,已经将BIU分别集成到IFU和EXU内部,从ITCM和DTCM取指指令执行不需要经过总线,只需通过ITCM接口即可;但是从主存或者FLASH执行时,需要通过BIU总线接口单元进行读取)

蜂鸟e203处理器的可配置选项

修改config.v的宏定义,可实现不同的配置。

蜂鸟e203处理器的流水线结构