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的宏定义,可实现不同的配置。