openc910源码LSU系列<19>

这篇具有很好参考价值的文章主要介绍了openc910源码LSU系列<19>。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ct_lsu_dcache_dirty_array

//C910_RTL_FACTORY\gen_rtl\lsu\rtl\ct_lsu_dcache_dirty_array.v

module ct_lsu_dcache_dirty_array(
  dirty_din,
  dirty_dout,
  dirty_gateclk_en,
  dirty_gwen_b,
  dirty_idx,
  dirty_sel_b,
  dirty_wen_b,
  forever_cpuclk,
  pad_yy_icg_scan_en,
  cp0_lsu_icg_en
);
input   [6:0]  dirty_din;
input          dirty_gateclk_en;    
input          dirty_gwen_b;        
input   [8:0]  dirty_idx;           
input          dirty_sel_b;
input   [6:0]  dirty_wen_b;
input          forever_cpuclk;      
input          pad_yy_icg_scan_en;
input          cp0_lsu_icg_en;
output  [6:0]  dirty_dout;

wire           dirty_clk;           
wire           dirty_clk_en;
wire    [6:0]  dirty_din;           
wire    [6:0]  dirty_dout;
wire           dirty_gateclk_en;    
wire           dirty_gwen_b;        
wire    [8:0]  dirty_idx;           
wire           dirty_sel_b;
wire    [6:0]  dirty_wen_b;
wire           forever_cpuclk;      
wire           pad_yy_icg_scan_en; 
wire           cp0_lsu_icg_en;  

//==========================================================
//                 Instance of Gated Cell
//==========================================================
assign dirty_clk_en = dirty_gateclk_en;
// &Instance("gated_clk_cell", "x_dcache_dirty_gated_clk"); @103
gated_clk_cell  x_dcache_dirty_gated_clk (
  .clk_in             (forever_cpuclk    ),
  .clk_out            (dirty_clk         ),
  .external_en        (1'b0              ),
  .global_en          (1'b1              ),
  .local_en           (dirty_clk_en      ),
  .module_en          (cp0_lsu_icg_en    ),
  .pad_yy_icg_scan_en (pad_yy_icg_scan_en)
);

// &Connect(.clk_in        (forever_cpuclk     ), @104
//          .external_en   (1'b0               ), @105
//          .global_en     (1'b1               ), @106
//          .module_en     (cp0_lsu_icg_en     ), @107
//          .local_en      (dirty_clk_en         ), @108
//          .clk_out       (dirty_clk            )); @109

//==========================================================
//              Instance dcache array
//==========================================================

// &Force("bus","dirty_idx","8","0"); @115

//csky vperl_off
`ifdef DCACHE_32K
ct_spsram_256x7  x_ct_spsram_256x7 (
  `ifdef MEM_CFG_IN
  .mem_cfg_in     (mem_cfg_in    ),
  `endif
  .A              (dirty_idx[7:0]),
  .CEN            (dirty_sel_b   ),
  .CLK            (dirty_clk     ),
  .D              (dirty_din     ),
  .GWEN           (dirty_gwen_b  ),
  .Q              (dirty_dout    ),
  .WEN            (dirty_wen_b   )
);
`endif//DCACHE_32K

`ifdef DCACHE_64K
ct_spsram_512x7  x_ct_spsram_512x7 (
  `ifdef MEM_CFG_IN
  .mem_cfg_in     (mem_cfg_in    ),
  `endif
  .A              (dirty_idx[8:0]),
  .CEN            (dirty_sel_b   ),
  .CLK            (dirty_clk     ),
  .D              (dirty_din     ),
  .GWEN           (dirty_gwen_b  ),
  .Q              (dirty_dout    ),
  .WEN            (dirty_wen_b   )
);
`endif//DCACHE_64K
//csky vperl_on

// &ModuleEnd; @183
endmodule

ct_lsu_dcache_dirty_array 模块中,实现了数据缓存(Dcache)中脏位数组的功能。这个模块主要负责处理数据缓存中的脏位(Dirty Bits),这些位标识了哪些缓存行已被修改并且需要在某个时刻写回到主存储器中。

输入和输出信号:

  • 输入信号:包括 dirty_din(写入的脏位数据)、dirty_gateclk_en(门控时钟使能)、dirty_gwen_b(全局写使能的反相)、dirty_idx(脏位数组的索引)、dirty_sel_b(选择信号的反相)和 dirty_wen_b(写使能的反相)。
  • 输出信号dirty_dout(读出的脏位数据)。

门控时钟单元:

  • gated_clk_cell 实例用于生成门控时钟,该时钟仅在需要访问脏位数组时才激活,以节省功耗。其控制信号包括 dirty_clk_en(局部门控时钟使能)和 cp0_lsu_icg_en(模块级门控时钟使能)。

脏位数组实例化:

  • 根据数据缓存的大小(例如 32K 或 64K),使用 ct_spsram_256x7ct_spsram_512x7 实例化脏位数组。
  • 数组实例的控制信号包括 dirty_idx(地址索引)、dirty_sel_b(选择信号的反相)、dirty_clk(门控时钟输出)、dirty_din(写入数据)、dirty_gwen_b(全局写使能的反相)和 dirty_wen_b(写使能信号)。

这个模块对于确保数据缓存的一致性非常重要。脏位标记了需要同步回主存储器的缓存行,这通常在缓存逐出或同步操作期间发生。

ct_lsu_dcache_data_array

module ct_lsu_dcache_data_array(
  data_din,
  data_dout,
  data_gateclk_en,
  data_gwen_b,
  data_idx,
  data_sel_b,
  data_wen_b,
  forever_cpuclk,
  pad_yy_icg_scan_en,
  cp0_lsu_icg_en
);
input   [31:0]  data_din;
input           data_gateclk_en;     
input           data_gwen_b;         
input   [10:0]  data_idx;            
input           data_sel_b;          
input   [3 :0]  data_wen_b;          
input           forever_cpuclk;      
input           pad_yy_icg_scan_en; 
input           cp0_lsu_icg_en;
output  [31:0]  data_dout;

wire            data_clk;            
wire            data_clk_en;
wire    [31:0]  data_din;            
wire    [31:0]  data_dout;
wire            data_gateclk_en;     
wire            data_gwen_b;         
wire    [10:0]  data_idx;            
wire            data_sel_b;          
wire    [3 :0]  data_wen_b;
wire    [31:0]  data_wen_b_all;
wire            forever_cpuclk;      
wire            pad_yy_icg_scan_en; 
wire            cp0_lsu_icg_en; 

//==========================================================
//                 Instance of Gated Cell
//==========================================================
assign data_clk_en = data_gateclk_en;
// &Instance("gated_clk_cell", "x_dcache_data_gated_clk"); @100
gated_clk_cell  x_dcache_data_gated_clk (
  .clk_in             (forever_cpuclk    ),
  .clk_out            (data_clk          ),
  .external_en        (1'b0              ),
  .global_en          (1'b1              ),
  .local_en           (data_clk_en       ),
  .module_en          (cp0_lsu_icg_en    ),
  .pad_yy_icg_scan_en (pad_yy_icg_scan_en)
);

// &Connect(.clk_in        (forever_cpuclk     ), @101
//          .external_en   (1'b0               ), @102
//          .global_en     (1'b1               ), @103
//          .module_en     (cp0_lsu_icg_en     ), @104
//          .local_en      (data_clk_en         ), @105
//          .clk_out       (data_clk            )); @106

//==========================================================
//              Instance dcache array
//==========================================================

// &Force("bus","data_idx","10","0"); @112
assign data_wen_b_all[31:0] = {{8{data_wen_b[3]}},
                              {8{data_wen_b[2]}},
                              {8{data_wen_b[1]}},
                              {8{data_wen_b[0]}}};

//csky vperl_off
`ifdef DCACHE_32K
ct_spsram_1024x32  x_ct_spsram_1024x32 (
  `ifdef MEM_CFG_IN
  .mem_cfg_in     (mem_cfg_in    ),
  `endif
  .A              (data_idx[9:0] ),
  .CEN            (data_sel_b    ),
  .CLK            (data_clk      ),
  .D              (data_din      ),
  .GWEN           (data_gwen_b   ),
  .Q              (data_dout     ),
  .WEN            (data_wen_b_all)
);
`endif//DCACHE_32K

`ifdef DCACHE_64K
ct_spsram_2048x32  x_ct_spsram_2048x32 (
  `ifdef MEM_CFG_IN
  .mem_cfg_in     (mem_cfg_in    ),
  `endif
  .A              (data_idx[10:0]),
  .CEN            (data_sel_b    ),
  .CLK            (data_clk      ),
  .D              (data_din      ),
  .GWEN           (data_gwen_b   ),
  .Q              (data_dout     ),
  .WEN            (data_wen_b_all)
);
`endif//DCACHE_64K
//csky vperl_on

// &ModuleEnd; @192
endmodule


ct_lsu_dcache_data_array 模块中,实现了数据缓存(Dcache)中的数据数组。这个模块是数据缓存的核心部分之一,负责存储和检索缓存中的实际数据。

输入和输出信号:

  • 输入信号:包括 data_din(写入的数据)、data_gateclk_en(门控时钟使能)、data_gwen_b(全局写使能的反相)、data_idx(数据数组的索引)、data_sel_b(选择信号的反相)和 data_wen_b(写使能信号的4位数组)。
  • 输出信号data_dout(读出的数据)。

门控时钟单元:

  • gated_clk_cell 实例用于生成门控时钟,该时钟仅在需要访问数据数组时才激活,以节省功耗。其控制信号包括 data_clk_en(局部门控时钟使能)和 cp0_lsu_icg_en(模块级门控时钟使能)。

数据数组实例化:

  • 根据数据缓存的大小(例如 32K 或 64K),使用 ct_spsram_1024x32ct_spsram_2048x32 实例化数据数组。
  • 数组实例的控制信号包括 data_idx(地址索引)、data_sel_b(选择信号的反相)、data_clk(门控时钟输出)、data_din(写入数据)、data_gwen_b(全局写使能的反相)和 data_wen_b_all(扩展的写使能信号)。

这个模块对于确保数据缓存的有效运行至关重要。它负责在缓存行中存储实际的数据,并在处理器请求时提供这些数据。

ct_lsu_ld_dc

//C910_RTL_FACTORY\gen_rtl\lsu\rtl\ct_lsu_ld_dc.v


module ct_lsu_ld_dc(
  cb_ld_dc_addr_hit,
  cp0_lsu_da_fwd_dis,
  cp0_lsu_dcache_en,
  cp0_lsu_icg_en,
  cp0_yy_clk_en,
  cpurst_b,
  ctrl_ld_clk,
  dcache_arb_ld_dc_borrow_db,
  dcache_arb_ld_dc_borrow_icc,
  dcache_arb_ld_dc_borrow_mmu,
  dcache_arb_ld_dc_borrow_sndb,
  dcache_arb_ld_dc_borrow_vb,
  dcache_arb_ld_dc_borrow_vld,
  dcache_arb_ld_dc_borrow_vld_gate,
  dcache_arb_ld_dc_settle_way,
  dcache_idx,
  dcache_lsu_ld_tag_dout,
  forever_cpuclk,
  had_yy_xx_bkpta_base,
  had_yy_xx_bkpta_mask,
  had_yy_xx_bkpta_rc,
  had_yy_xx_bkptb_base,
  had_yy_xx_bkptb_mask,
  had_yy_xx_bkptb_rc,
  icc_dcache_arb_ld_tag_read,
  ld_ag_addr1_to4,
  ld_ag_ahead_predict,
  ld_ag_already_da,
  ld_ag_atomic,
  ld_ag_boundary,
  ld_ag_dc_access_size,
  ld_ag_dc_acclr_en,
  ld_ag_dc_addr0,
  ld_ag_dc_bytes_vld,
  ld_ag_dc_bytes_vld1,
  ld_ag_dc_fwd_bypass_en,
  ld_ag_dc_inst_vld,
  ld_ag_dc_load_ahead_inst_vld,
  ld_ag_dc_load_inst_vld,
  ld_ag_dc_mmu_req,
  ld_ag_dc_rot_sel,
  ld_ag_dc_vload_ahead_inst_vld,
  ld_ag_dc_vload_inst_vld,
  ld_ag_expt_access_fault_with_page,
  ld_ag_expt_ldamo_not_ca,
  ld_ag_expt_misalign_no_page,
  ld_ag_expt_misalign_with_page,
  ld_ag_expt_page_fault,
  ld_ag_expt_vld,
  ld_ag_iid,
  ld_ag_inst_type,
  ld_ag_inst_vfls,
  ld_ag_inst_vld,
  ld_ag_ldfifo_pc,
  ld_ag_lsid,
  ld_ag_lsiq_bkpta_data,
  ld_ag_lsiq_bkptb_data,
  ld_ag_lsiq_spec_fail,
  ld_ag_no_spec,
  ld_ag_no_spec_exist,
  ld_ag_old,
  ld_ag_page_buf,
  ld_ag_page_ca,
  ld_ag_page_sec,
  ld_ag_page_share,
  ld_ag_page_so,
  ld_ag_pf_inst,
  ld_ag_preg,
  ld_ag_raw_new,
  ld_ag_secd,
  ld_ag_sign_extend,
  ld_ag_split,
  ld_ag_utlb_miss,
  ld_ag_vpn,
  ld_ag_vreg,
  ld_dc_addr0,
  ld_dc_addr1,
  ld_dc_addr1_11to4,
  ld_dc_ahead_predict,
  ld_dc_ahead_preg_wb_vld,
  ld_dc_ahead_vreg_wb_vld,
  ld_dc_already_da,
  ld_dc_atomic,
  ld_dc_bkpta_data,
  ld_dc_bkptb_data,
  ld_dc_borrow_db,
  ld_dc_borrow_icc,
  ld_dc_borrow_icc_tag,
  ld_dc_borrow_mmu,
  ld_dc_borrow_sndb,
  ld_dc_borrow_vb,
  ld_dc_borrow_vld,
  ld_dc_boundary,
  ld_dc_bytes_vld,
  ld_dc_bytes_vld1,
  ld_dc_cb_addr_create_gateclk_en,
  ld_dc_cb_addr_create_vld,
  ld_dc_cb_addr_tto4,
  ld_dc_chk_atomic_inst_vld,
  ld_dc_chk_ld_addr1_vld,
  ld_dc_chk_ld_bypass_vld,
  ld_dc_chk_ld_inst_vld,
  ld_dc_da_bytes_vld,
  ld_dc_da_bytes_vld1,
  ld_dc_da_cb_addr_create,
  ld_dc_da_cb_merge_en,
  ld_dc_da_data_rot_sel,
  ld_dc_da_expt_vld_gate_en,
  ld_dc_da_icc_tag_vld,
  ld_dc_da_inst_vld,
  ld_dc_da_old,
  ld_dc_da_page_buf,
  ld_dc_da_page_ca,
  ld_dc_da_page_sec,
  ld_dc_da_page_share,
  ld_dc_da_page_so,
  ld_dc_da_pf_inst,
  ld_dc_da_tag_read,
  ld_dc_dcache_hit,
  ld_dc_expt_access_fault_extra,
  ld_dc_expt_access_fault_mask,
  ld_dc_expt_vec,
  ld_dc_expt_vld_except_access_err,
  ld_dc_fwd_bytes_vld,
  ld_dc_fwd_sq_vld,
  ld_dc_fwd_wmb_vld,
  ld_dc_get_dcache_data,
  ld_dc_hit_high_region,
  ld_dc_hit_low_region,
  ld_dc_idu_lq_full,
  ld_dc_idu_tlb_busy,
  ld_dc_iid,
  ld_dc_imme_wakeup,
  ld_dc_inst_chk_vld,
  ld_dc_inst_size,
  ld_dc_inst_type,
  ld_dc_inst_vfls,
  ld_dc_inst_vld,
  ld_dc_ldfifo_pc,
  ld_dc_lq_create1_dp_vld,
  ld_dc_lq_create1_gateclk_en,
  ld_dc_lq_create1_vld,
  ld_dc_lq_create_dp_vld,
  ld_dc_lq_create_gateclk_en,
  ld_dc_lq_create_vld,
  ld_dc_lq_full_gateclk_en,
  ld_dc_lsid,
  ld_dc_mmu_req,
  ld_dc_mt_value,
  ld_dc_no_spec,
  ld_dc_no_spec_exist,
  ld_dc_pfu_info_set_vld,
  ld_dc_pfu_va,
  ld_dc_preg,
  ld_dc_preg_sign_sel,
  ld_dc_secd,
  ld_dc_settle_way,
  ld_dc_sign_extend,
  ld_dc_spec_fail,
  ld_dc_split,
  ld_dc_tlb_busy_gateclk_en,
  ld_dc_vector_nop,
  ld_dc_vreg,
  ld_dc_vreg_sign_sel,
  ld_dc_wait_fence,
  lq_ld_dc_full,
  lq_ld_dc_inst_hit,
  lq_ld_dc_less2,
  lq_ld_dc_spec_fail,
  lsu_dcache_ld_xx_gwen,
  lsu_has_fence,
  lsu_idu_dc_pipe3_load_fwd_inst_vld_dup1,
  lsu_idu_dc_pipe3_load_fwd_inst_vld_dup2,
  lsu_idu_dc_pipe3_load_fwd_inst_vld_dup3,
  lsu_idu_dc_pipe3_load_fwd_inst_vld_dup4,
  lsu_idu_dc_pipe3_load_inst_vld_dup0,
  lsu_idu_dc_pipe3_load_inst_vld_dup1,
  lsu_idu_dc_pipe3_load_inst_vld_dup2,
  lsu_idu_dc_pipe3_load_inst_vld_dup3,
  lsu_idu_dc_pipe3_load_inst_vld_dup4,
  lsu_idu_dc_pipe3_preg_dup0,
  lsu_idu_dc_pipe3_preg_dup1,
  lsu_idu_dc_pipe3_preg_dup2,
  lsu_idu_dc_pipe3_preg_dup3,
  lsu_idu_dc_pipe3_preg_dup4,
  lsu_idu_dc_pipe3_vload_fwd_inst_vld,
  lsu_idu_dc_pipe3_vload_inst_vld_dup0,
  lsu_idu_dc_pipe3_vload_inst_vld_dup1,
  lsu_idu_dc_pipe3_vload_inst_vld_dup2,
  lsu_idu_dc_pipe3_vload_inst_vld_dup3,
  lsu_idu_dc_pipe3_vreg_dup0,
  lsu_idu_dc_pipe3_vreg_dup1,
  lsu_idu_dc_pipe3_vreg_dup2,
  lsu_idu_dc_pipe3_vreg_dup3,
  lsu_mmu_vabuf0,
  mmu_lsu_data_req_size,
  mmu_lsu_mmu_en,
  mmu_lsu_tlb_busy,
  pad_yy_icg_scan_en,
  pfu_pfb_empty,
  pfu_sdb_create_gateclk_en,
  pfu_sdb_empty,
  rb_fence_ld,
  rtu_yy_xx_flush,
  sq_ld_dc_addr1_dep_discard,
  sq_ld_dc_cancel_acc_req,
  sq_ld_dc_cancel_ahead_wb,
  sq_ld_dc_fwd_req,
  sq_ld_dc_has_fwd_req,
  st_dc_addr0,
  st_dc_bytes_vld,
  st_dc_chk_st_inst_vld,
  st_dc_chk_statomic_inst_vld,
  st_dc_inst_vld,
  wmb_fwd_bytes_vld,
  wmb_ld_dc_cancel_acc_req,
  wmb_ld_dc_discard_req,
  wmb_ld_dc_fwd_req
);

ct_lsu_ld_dc 模块是负载/存储单元(LSU)的一个关键部分,专注于处理加载指令的数据缓存(Dcache)访问和管理。此模块负责管理来自地址生成(AG)阶段的加载请求,并与数据缓存及其他 LSU 子模块协同工作,以完成数据的加载操作。以下是其主要功能和组件:

主要功能:

  • 缓存访问管理:管理与数据缓存的交互,包括对缓存命中和未命中的处理。
  • 转发和借用逻辑:处理从存储队列(SQ)或写回缓存(WMB)的转发请求,以及处理对其他单元的借用请求。
  • 异常和中断处理:处理由于访问冲突、缺页或其他原因引起的异常和中断。
  • 数据对齐和旋转:确保加载的数据正确对齐,并在需要时进行旋转处理。

关键输入信号:

  • 来自 AG 阶段的信号:如 ld_ag_dc_addr0(加载地址)、ld_ag_dc_bytes_vld(有效字节指示)等,提供关于加载请求的详细信息。
  • 来自数据缓存的信号:如 dcache_lsu_ld_tag_dout(缓存标签输出),用于确定缓存命中或未命中。
  • 来自其他 LSU 单元的信号:如 sq_ld_dc_fwd_req(从存储队列的转发请求),用于处理加载与存储之间的数据依赖。

关键输出信号:

  • 向数据缓存发送的信号:如 lsu_dcache_ld_xx_gwen(加载数据写使能),控制缓存的读写操作。
  • 向执行单元发送的信号:如 ld_dc_inst_type(加载指令类型),用于指示加载操作的特定细节。
  • 向其他 LSU 单元发送的信号:如 ld_dc_pfu_info_set_vld(向预取单元发送的有效信号),用于协调 LSU 内部的各种操作。

内部逻辑:

  • 地址计算和比较:计算加载地址,并与缓存中的地址进行比较,以确定命中或未命中。
  • 访问控制:根据 CPU 的当前状态(如异常、中断或特权级别)控制对缓存的访问。
  • 数据转发和借用逻辑:管理与存储队列和写回缓存的数据交互,以及对其他 LSU 子模块的借用请求。

总体来说,ct_lsu_ld_dc 模块是 CPU 中负责处理加载指令和数据缓存交互的关键部分,它确保了加载操作的高效和准确执行。



parameter BYTE  = 2'b00,
          HALF  = 2'b01,
          WORD  = 2'b10,
          DWORD = 2'b11;
parameter VB_DATA_ENTRY = 3,
          LSIQ_ENTRY    = 12;
parameter VMB_ENTRY     = 8;
parameter PC_LEN        = 15;

//==========================================================
//                 Instance of Gated Cell  
//==========================================================
assign ld_dc_clk_en = ld_ag_inst_vld
                      ||  dcache_arb_ld_dc_borrow_vld_gate;
// &Instance("gated_clk_cell", "x_lsu_ld_dc_gated_clk"); @46
gated_clk_cell  x_lsu_ld_dc_gated_clk (
  .clk_in             (forever_cpuclk    ),
  .clk_out            (ld_dc_clk         ),
  .external_en        (1'b0              ),
  .global_en          (1'b1              ),
  .local_en           (ld_dc_clk_en      ),
  .module_en          (cp0_lsu_icg_en    ),
  .pad_yy_icg_scan_en (pad_yy_icg_scan_en)
);

// &Connect(.clk_in        (forever_cpuclk     ), @47
//          .external_en   (1'b0               ), @48
//          .global_en     (1'b1               ), @49
//          .module_en     (cp0_lsu_icg_en     ), @50
//          .local_en      (ld_dc_clk_en       ), @51
//          .clk_out       (ld_dc_clk          )); @52

assign ld_dc_inst_clk_en = ld_ag_inst_vld;
// &Instance("gated_clk_cell", "x_lsu_ld_dc_inst_gated_clk"); @55
gated_clk_cell  x_lsu_ld_dc_inst_gated_clk (
  .clk_in             (forever_cpuclk    ),
  .clk_out            (ld_dc_inst_clk    ),
  .external_en        (1'b0              ),
  .global_en          (cp0_yy_clk_en     ),
  .local_en           (ld_dc_inst_clk_en ),
  .module_en          (cp0_lsu_icg_en    ),
  .pad_yy_icg_scan_en (pad_yy_icg_scan_en)
);

// &Connect(.clk_in        (forever_cpuclk     ), @56
//          .external_en   (1'b0               ), @57
//          .global_en     (cp0_yy_clk_en      ), @58
//          .module_en     (cp0_lsu_icg_en     ), @59
//          .local_en      (ld_dc_inst_clk_en  ), @60
//          .clk_out       (ld_dc_inst_clk     )); @61

assign ld_dc_borrow_clk_en = dcache_arb_ld_dc_borrow_vld_gate;
// &Instance("gated_clk_cell", "x_lsu_ld_dc_borrow_gated_clk"); @64
gated_clk_cell  x_lsu_ld_dc_borrow_gated_clk (
  .clk_in              (forever_cpuclk     ),
  .clk_out             (ld_dc_borrow_clk   ),
  .external_en         (1'b0               ),
  .global_en           (1'b1               ),
  .local_en            (ld_dc_borrow_clk_en),
  .module_en           (cp0_lsu_icg_en     ),
  .pad_yy_icg_scan_en  (pad_yy_icg_scan_en )
);

在这段代码中,定义了一个名为 ct_lsu_ld_dc 的模块的一部分,这个模块主要负责加载/存储单元(LSU)的加载数据缓存(Dcache)访问和管理。文章来源地址https://www.toymoban.com/news/detail-788331.html

参数定义

  • 字节大小的参数:定义了不同数据类型的大小,如 BYTEHALFWORDDWORD
  • 各种缓存条目大小的参数:例如 VB_DATA_ENTRYLSIQ_ENTRYVMB_ENTRYPC_LEN,这些参数定义了各种队列和缓冲区的大小。

门控时钟单元实例

  • 加载数据缓存时钟 (ld_dc_clk):由 ld_dc_clk_en 信号控制,当有加载指令有效或有数据缓存借用请求有效时,该时钟被使能。
  • 加载指令时钟 (ld_dc_inst_clk):由 ld_dc_inst_clk_en 信号控制,仅当加载指令有效时使能。
  • 借用逻辑时钟 (ld_dc_borrow_clk):由 ld_dc_borrow_clk_en 信号控制,用于管理数据缓存的借用请求。

门控时钟单元 (gated_clk_cell) 的作用

  • 提高能效:通过只在需要时使能特定的时钟,降低功耗。
  • 控制访问:确保仅在相关操作需要时才激活相应的逻辑部分,提高性能和资源利用率。

连接 (&Connect) 注释

  • 这些注释说明了如何将 gated_clk_cell 模块的输入和输出连接到 ct_lsu_ld_dc 模块的其他部分。它们是为了阐明信号如何在模块之间传递,尽管实际的 Verilog 代码并未包含这些连接。

到了这里,关于openc910源码LSU系列<19>的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【RISC-V】RISC-V寄存器

    寄存器 别名 全称 说明 X0 zero 零寄存器 可做源寄存器(rs)或目标寄存器(rd) X1 ra 链接寄存器 保存函数返回地址 X2 sp 栈指针寄存器 指向栈的地址 X3 gp 全局寄存器 用于链接器松弛优化 X4 tp 线程寄存器 常用于在OS中保存指向进程控制块(task_struct)数据结构的指针 X5 ~ X7 X28 ~ X31 t0

    2024年02月10日
    浏览(36)
  • RISC-V(1)——RISC-V是什么,有什么用

    目录 1. RISC-V是什么 2. RISC-V指令集 3. RISC-V特权架构 4. RiscV的寄存器描述 5. 指令  5.1 算数运算—add/sub/addi/mul/div/rem  5.2 逻辑运算—and/andi/or/ori/xor/xori 5.3 位移运算—sll/slli/srl/srli/sra/srai 5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw 5.5 比较指令—slt/slti/sltu/sltiu 5.6 条件分支指令—

    2024年02月11日
    浏览(45)
  • 什么是RISC-V?以及RISC-V和ARM、X86的区别

    RISC-V 是基于 RISC 精简指令集架构开发的一个开放式指令集架构,它是由加州大学伯克利分校的计算机科学教授 Krste Asanovic (克里斯蒂安·阿萨诺维奇)领导的团队开发,RISC-V是 开放 的,任何人都可以使用它来开发处理器芯片和其他硬件,而无需支付任何许可或使用费用。

    2024年02月15日
    浏览(44)
  • 【RISC-V】基于开源RISC-V MCU内核PicoRV32的FPGA移植

    核心板:GW2A-LV18PG256C8IC8I7 底板:Dock底板 有关核心板和底板相关资料的参考网址:Tang Primer 20K - Sipeed Wiki  FPGA硬件设计软件:高云云源软件;下载地址:广东高云半导体科技股份有限公司 PicoRV32描述,以及文档介绍详情见网址PicoRV32 - 高云 - 广东高云半导体科技股份有限公司

    2023年04月09日
    浏览(40)
  • 国内 RISC-V 产学研基地成立,Intel、Arm、RISC-V 将三分天下?

    作者 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 在IT界,CPU芯片和操作系统是网信领域最基础的核心技术。但在芯片领域,技术和资本的门槛较高,应用范围最广的指令集架构需获得专利授权才能使用,如x86、Arm等。而投入研发的资金,以14nm工艺为例,需上亿元的研发费用。 如何降

    2024年01月17日
    浏览(50)
  • RISC-V公测平台发布 · 第一个WEB Server “Hello RISC-V world!”

    RISC-V公测平台Web Server地址:http://175.8.161.253:8081 Web Server是互联网应用的基础设施,无论是用户访问网站,还是后端服务提供商和开发者构建各种应用程序,Web Server都在其中扮演着至关重要的角色。 显而易见,对于RISC-V生态来说, Web Server也是不可缺少的一部分 。 接下来我们

    2024年02月14日
    浏览(50)
  • 从零学习开发一个RISC-V操作系统(四)丨RISC-V汇编语言编程

       本系列是博主参考B站课程学习开发一个RISC-V的操作系统的学习笔记,计划从RISC-V的底层汇编指令学起,结合C语言,在Ubuntu 20.04上开发一个简易的操作系统。一个目的是通过实践操作学习和了解什么是操作系统,第二个目的是为之后学习RISC-V的集成电路设计打下一定基础

    2024年01月25日
    浏览(53)
  • RISC-V 中国峰会 | OpenMPL引人注目,RISC-V Summit China 2023圆满落幕

         2023年8月25日,为期三天的RISC-V中国峰会(RISC-V Summit China 2023)圆满落幕。本届峰会以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。吸引了超过百家企业及研究机构、开源技术社区参与交流,近百家媒体跟踪报道。

    2024年02月10日
    浏览(47)
  • RISC-V公测平台发布 · 数据库在RISC-V服务器上的适配评估

    前言 上一期讲到YCSB在RISC-V服务器上对MySQL进行性能测试(RISC-V公测平台发布 · 使用YCSB测试SG2042上的MySQL性能),在这一期文章中,我们继续深入讨论RISC-V+数据库的应用。本期就继续利用HS-2平台来测试数据库软件在RISC-V服务器上的兼容性。 参与此次实验的数据库如下: Red

    2024年02月12日
    浏览(37)
  • 【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(六)- 向量内存一致性模型

    以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量算术指令格式、向量整数和浮点算术

    2024年04月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包