蜂鸟E203 硬件学习(一)

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

蜂鸟E203 硬件学习(一)_第1张图片

使用标准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 = sel1?in1[3:0]:
					sel2?in2[3:0]:
						sel3?in3[3:0]:
							4'b0;

如果希望生成一种并行选择的逻辑

assign out=({4{sel1}} & in1[3:0])
					| ({4{sel2}} & in2[3:0])
					|({4{sel3}} & in3[3:0]);

(3)在数据通路上可以使用不带reset的寄存器,只在控制通路上使用带reset的寄存器
(4)clk和reset信号应禁止被用于其他逻辑功能,只能接入DFF作为时钟和复位信号

(二)蜂鸟E200模块层次划分
蜂鸟E203 硬件学习(一)_第2张图片
模块层次划分如下
顶层的e203_cpu_top仅例化两个模块
(1)e203_cpu (处理器核的所有逻辑部分)

  • e203_clk_ctrl:用于控制处理器主要组件的自动时钟门控
  • e203_irq_sync:用于将外界的异步中断信号进行同步
  • e203_itcm_ctrl 和 e203_dtcm_ctrl用于控制ITCM和DTCM的访问
  • e203_reset_ctrl:将外界的异步reset信号进行同步使之变成“异步置位同步释放”的复位信号
  • 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 硬件学习(一)_第3张图片

(2)e203_srams (处理器核的所有SRAM部分)

  • e203_dtcm_ram
  • e203_itcm_ram

(三)E203的流水线
(1)流水线与状态机
流水线本质可以理解为一种以面积换性能,以空间换时间,增加流水线级别之间的寄存器,每一个流水线级数内部都有各自的组合逻辑通路,彼此之间没有复用资源,所以面积开销较大;但是可以让不同的流水线级数同时做不同的事情,提高了性能,优化了时序(提高了最大频率),增加了吞吐率。
与流水线相对应的策略是状态机,状态机可以理解为以性能换面积、以时间换空间,可以省略上述流水线的寄存器开销,还可以使用复用逻辑数据通路,因此面积开销较小,但性能和吞吐率很差。

即流水线的深度-> 性能与面积 trade off
(2)流水线中的反压
信号传输过程中,接收方成功接收到发送方发送的数据时,向发送方返回ack,由于反馈ack信号在每个时钟下的发送实时变化,接收方没有一定的缓存能力,会产生实时反压,现有技术在遇见此实时反压情形时,会导致流水线不断中断的情况。
解决的方案:
(1)取消握手:能够杜绝反压的发生,但是取消握手可能会造成功能错误或者指令丢失,因此这种方案往往需要配合其他机制,如replay,预留大缓存等
(2)加入乒乓缓存:可以使得流水线向上一级流水线的握手接收信号只需关注乒乓缓存中是否有空余的缓存即可。
(3)加入前向旁路缓存 ->蜂鸟正是采用这种方法

你可能感兴趣的:(蜂鸟E203)