openc910源码LSU系列之<97>

ct_lsu_pfu_gsdb

module ct_lsu_pfu_gsdb(
  cp0_lsu_icg_en,
  cp0_yy_clk_en,
  cp0_yy_dcache_pref_en,
  cpurst_b,
  forever_cpuclk,
  ld_da_iid,
  ld_da_pfu_act_vld,
  ld_da_pfu_pf_inst_vld,
  ld_da_pfu_va,
  pad_yy_icg_scan_en,
  pfu_gpfb_vld,
  pfu_gsdb_gpfb_create_vld,
  pfu_gsdb_gpfb_pop_req,
  pfu_gsdb_stride,
  pfu_gsdb_stride_neg,
  pfu_gsdb_strideh_6to0,
  pfu_pop_all_vld,
  rtu_yy_xx_commit0,
  rtu_yy_xx_commit0_iid,
  rtu_yy_xx_commit1,
  rtu_yy_xx_commit1_iid,
  rtu_yy_xx_commit2,
  rtu_yy_xx_commit2_iid,
  rtu_yy_xx_flush
);

ct_lsu_pfu_gsdb 模块似乎是处理器负载存储单元(LSU)中的一部分,具体与预取单元(PFU)相关。这个模块主要处理全局步幅检测缓冲区(GSDB),很可能用于检测预取目的的步幅模式。

接口分析

  1. 控制和配置输入:

    • cp0_lsu_icg_encp0_yy_clk_encp0_yy_dcache_pref_en:这些控制信号可能来自控制/状态寄存器,指示是否启用了某些功能(如时钟门控或数据缓存预取)。
    • cpurst_b:复位信号,用于初始化或重置模块的状态。
  2. 时钟和扫描输入:

    • forever_cpuclkpad_yy_icg_scan_en:这些信号提供时钟输入和测试目的的扫描控制。
  3. 加载数据输入:

    • ld_da_iidld_da_pfu_act_vldld_da_pfu_pf_inst_vldld_da_pfu_va:这些信号可能与加载操作相关,表示指令 ID、预取动作的有效性、预取指令的有效性和加载操作的虚拟地址。
  4. 预取和全局预取缓冲区(GPFB)信号:

    • pfu_gpfb_vldpfu_gsdb_gpfb_create_vldpfu_gsdb_gpfb_pop_req:这些信号看起来与全局预取缓冲区的管理有关,指示预取条目的有效性、创建和弹出请求。
  5. 步幅检测输入:

    • pfu_gsdb_stridepfu_gsdb_stride_negpfu_gsdb_strideh_6to0:这些输入可能用于计算或确定预取操作的步幅。包含负步幅信号表明步幅检测逻辑考虑了正负步幅。
  6. 弹出和刷新信号:

    • pfu_pop_all_vldrtu_yy_xx_flush:这些输入可能用于在某些条件下(如流水线刷新)控制预取请求或条目的刷新或清除。
  7. 返回/提交输入:

    • rtu_yy_xx_commit0rtu_yy_xx_commit0_iidrtu_yy_xx_commit1rtu_yy_xx_commit1_iidrtu_yy_xx_commit2rtu_yy_xx_commit2_iid:这些信号可能与指令的提交阶段相关,可能用于根据某些指令的完成情况更新 GSDB 的状态。

功能概述

ct_lsu_pfu_gsdb 模块在 CPU 的预取机制中扮演着关键角色,特别是在检测有效预取的步幅模式方面。它可能与加载操作和全局预取缓冲区交互,以根据检测到的步幅和指令提交动态调整预取策略。提交阶段信号的涉及表明,这个模块可能会根据某些指令的完成情况更新其状态,这在高级预取策略中是常见的技术。

parameter IDLE              = 4'b0000,
          GET_STRIDE        = 4'b1001,
          CHECK_STRIDE      = 4'b1010,
          MONITOR_STRIDE    = 4'b1100;

//==========================================================
//                 Instance of Gated Cell  
//==========================================================
assign pfu_gsdb_clk_en  = pfu_gsdb_vld
                          ||  pfu_gsdb_create_gateclk_en;
// &Instance("gated_clk_cell", "x_lsu_pfu_gsdb_gated_clk"); @43
gated_clk_cell  x_lsu_pfu_gsdb_gated_clk (
  .clk_in             (forever_cpuclk    ),
  .clk_out            (pfu_gsdb_clk      ),
  .external_en        (1'b0              ),
  .global_en          (cp0_yy_clk_en     ),
  .local_en           (pfu_gsdb_clk_en   ),
  .module_en          (cp0_lsu_icg_en    ),
  .pad_yy_icg_scan_en (pad_yy_icg_scan_en)
);

// &Connect(.clk_in        (forever_cpuclk     ), @44
//          .external_en   (1'b0               ), @45
//          .global_en     (cp0_yy_clk_en      ), @46
//          .module_en     (cp0_lsu_icg_en     ), @47
//          .local_en      (pfu_gsdb_clk_en    ), @48
//          .clk_out       (pfu_gsdb_clk       )); @49

assign pfu_gsdb_pf_inst_vld_clk_en = pfu_gsdb_pf_inst_vld;
// &Instance("gated_clk_cell", "x_lsu_pfu_gsdb_pf_inst_vld_gated_clk"); @52
gated_clk_cell  x_lsu_pfu_gsdb_pf_inst_vld_gated_clk (
  .clk_in                      (forever_cpuclk             ),
  .clk_out                     (pfu_gsdb_pf_inst_vld_clk   ),
  .external_en                 (1'b0                       ),
  .global_en                   (cp0_yy_clk_en              ),
  .local_en                    (pfu_gsdb_pf_inst_vld_clk_en),
  .module_en                   (cp0_lsu_icg_en             ),
  .pad_yy_icg_scan_en          (pad_yy_icg_scan_en         )
);

全局步幅检测缓冲区(Global Stride Detection Buffer,简称GSDB)的时钟门控逻辑。它使用 gated_clk_cell 模块来控制不同操作的时钟流动,以实现能源节约和效率提升。

时钟门控单元(Gated Clock Cell)

  1. 基本结构:

    • gated_clk_cell 是一个标准的时钟门控单元,用于根据不同的使能信号开启或关闭时钟信号。这对于动态电源管理非常重要,因为它允许在不需要时关闭模块的时钟,从而节省能源。
  2. 时钟使能信号(Clock Enable Signals):

    • pfu_gsdb_clk_en:这是GSDB的主要时钟使能信号,由 pfu_gsdb_vld(GSDB有效性)或 pfu_gsdb_create_gateclk_en(GSDB创建的额外门控时钟使能)控制。
    • pfu_gsdb_pf_inst_vld_clk_en:专用于控制预取指令有效性的时钟使能信号。
  3. 时钟门控单元的连接:

    • 每个时钟门控单元实例都连接了相同的输入和输出信号,但是使用了不同的本地使能(local_en)信号。这些实例包括:x_lsu_pfu_gsdb_gated_clkx_lsu_pfu_gsdb_pf_inst_vld_gated_clk
    • 共同的输入包括 forever_cpuclk(持续的CPU时钟),cp0_yy_clk_en(全局使能),cp0_lsu_icg_en(模块使能),和 pad_yy_icg_scan_en(扫描使能,用于测试模式)。

功能和重要性

  • 动态电源管理: 通过在不同的操作阶段启用或禁用时钟,这种方法可以显著减少处理器的功耗。
  • 性能优化: 时钟门控还可以减少不必要的计算和内存访问,从而提高整体性能。
  • 模块化设计: 使用标准的 gated_clk_cell 模块说明了代码的模块化设计,易于维护和更新。
//==========================================================
//                 Register
//==========================================================
//+-------+
//| state |
//+-------+
always @(posedge pfu_gsdb_clk or negedge cpurst_b)
begin
  if (!cpurst_b)
    pfu_gsdb_state[3:0] <=  IDLE;
  else if(pfu_pop_all_vld)
    pfu_gsdb_state[3:0] <=  IDLE;
  else
    pfu_gsdb_state[3:0] <=  pfu_gsdb_next_state[3:0];
end
assign pfu_gsdb_vld = pfu_gsdb_state[3];

//+----------------+
//| newest_pf_inst | 
//+----------------+
always @(posedge pfu_gsdb_clk or negedge cpurst_b)
begin
  if (!cpurst_b)
    pfu_gsdb_newest_pf_inst_vld <=  1'b0;
  else if(pfu_gsdb_create_dp_vld || pfu_gsdb_newest_pf_inst_flush_uncmit)
    pfu_gsdb_newest_pf_inst_vld <=  1'b0;
  else if(pfu_gsdb_vld  &&  pfu_gsdb_pf_inst_vld)
    pfu_gsdb_newest_pf_inst_vld <=  1'b1;
end

always @(posedge pfu_gsdb_pf_inst_vld_clk or negedge cpurst_b)
begin
  if (!cpurst_b)
    pfu_gsdb_newest_pf_inst_iid[6:0]  <=  7'b0;
  else if(pfu_gsdb_newest_pf_inst_set)
    pfu_gsdb_newest_pf_inst_iid[6:0]  <=  ld_da_iid[6:0];
end

always @(posedge pfu_gsdb_clk or negedge cpurst_b)
begin
  if (!cpurst_b)
    pfu_gsdb_newest_pf_inst_cmit  <=  1'b0;
  else if(pfu_gsdb_newest_pf_inst_set)
    pfu_gsdb_newest_pf_inst_cmit  <=  1'b0;
  else if(pfu_gsdb_newest_pf_inst_cmit_set)
    pfu_gsdb_newest_pf_inst_cmit  <=  1'b1;
end

//+-----------------------------+
//| gsdb to gpfb pop confidence | 
//+-----------------------------+
always @(posedge pfu_gsdb_clk or negedge cpurst_b)
begin
  if (!cpurst_b)
    pfu_gsdb_pop_confidence[1:0] <=  2'b0;
  else if(confidence_reset)
    pfu_gsdb_pop_confidence[1:0] <=  2'b10;
  else if(confidence_sub_vld)
    pfu_gsdb_pop_confidence[1:0] <=  pfu_gsdb_pop_confidence[1:0] - 2'b01;
  else if(confidence_add_vld)
    pfu_gsdb_pop_confidence[1:0] <=  pfu_gsdb_pop_confidence[1:0] + 2'b01;
end

寄存器定义和更新逻辑

  1. 状态寄存器(State Register):

    • pfu_gsdb_clk 的正边沿或 cpurst_b 的负边沿更新。
    • 在复位时设置为 IDLE 状态。
    • 根据 pfu_pop_all_vld 信号或计算出的下一个状态 pfu_gsdb_next_state 来更新状态。
    • pfu_gsdb_vld 标志由状态寄存器的最高位确定。
  2. 最新预取指令有效性(Newest Prefetch Instruction Validity):

    • 在相同的时钟边沿更新。
    • 在复位时清零。
    • 在创建信号 pfu_gsdb_create_dp_vld 有效或刷新未提交时重置为零。
    • 在 GSDB 有效且有预取指令时设置为一。
  3. 最新预取指令的指令ID(Instruction ID):

    • 使用专用的 pfu_gsdb_pf_inst_vld_clk 时钟更新。
    • 在复位时清零。
    • 当设置信号 pfu_gsdb_newest_pf_inst_set 有效时,从 ld_da_iid 获取指令ID。
  4. 最新预取指令提交标志(Newest Prefetch Instruction Commit Flag):

    • pfu_gsdb_clk 的正边沿更新。
    • 在复位时清零。
    • 当设置信号 pfu_gsdb_newest_pf_inst_cmit_set 有效时设置为一。
  5. 弹出置信度(Pop Confidence):

    • 用于管理 GSDB 到 GPFB(全局预取缓冲区)弹出的置信度。
    • 在复位时清零。
    • 根据置信度重置、减少或增加信号来调整置信度。

功能和重要性

  • 这些寄存器为 GSDB 提供了关键的状态信息,如当前状态、最新预取指令的有效性和ID、以及预取弹出的置信度。
  • 通过精确地管理这些状态,可以更有效地处理预取逻辑,例如根据检测到的步幅模式调整预取策略。
  • 这种状态管理对于优化预取策略、提高缓存效率和处理器性能至关重要。
//==========================================================
//                Instance addr cmp
//==========================================================
// &ConnRule(s/^entry_/pfu_gsdb_/); @125
// &Instance("ct_lsu_pfu_sdb_cmp","x_ct_lsu_pfu_gsdb_cmp"); @126
ct_lsu_pfu_sdb_cmp  x_ct_lsu_pfu_gsdb_cmp (
  .cp0_lsu_icg_en                (cp0_lsu_icg_en               ),
  .cp0_yy_clk_en                 (cp0_yy_clk_en                ),
  .cpurst_b                      (cpurst_b                     ),
  .entry_addr0_act               (pfu_gsdb_addr0_act           ),
  .entry_addr_cmp_info_vld       (pfu_gsdb_addr_cmp_info_vld   ),
  .entry_check_stride_success    (pfu_gsdb_check_stride_success),
  .entry_clk                     (pfu_gsdb_clk                 ),
  .entry_create_dp_vld           (pfu_gsdb_create_dp_vld       ),
  .entry_create_gateclk_en       (pfu_gsdb_create_gateclk_en   ),
  .entry_normal_stride           (pfu_gsdb_normal_stride       ),
  .entry_pf_inst_vld             (pfu_gsdb_pf_inst_vld         ),
  .entry_stride                  (pfu_gsdb_stride              ),
  .entry_stride_keep             (monitor_with_confidence      ),
  .entry_stride_neg              (pfu_gsdb_stride_neg          ),
  .entry_strideh_6to0            (pfu_gsdb_strideh_6to0        ),
  .entry_vld                     (pfu_gsdb_vld                 ),
  .forever_cpuclk                (forever_cpuclk               ),
  .ld_da_iid                     (ld_da_iid                    ),
  .pad_yy_icg_scan_en            (pad_yy_icg_scan_en           ),
  .pipe_va                       (ld_da_pfu_va                 ),
  .rtu_yy_xx_commit0             (rtu_yy_xx_commit0            ),
  .rtu_yy_xx_commit0_iid         (rtu_yy_xx_commit0_iid        ),
  .rtu_yy_xx_commit1             (rtu_yy_xx_commit1            ),
  .rtu_yy_xx_commit1_iid         (rtu_yy_xx_commit1_iid        ),
  .rtu_yy_xx_commit2             (rtu_yy_xx_commit2            ),
  .rtu_yy_xx_commit2_iid         (rtu_yy_xx_commit2_iid        ),
  .rtu_yy_xx_flush               (rtu_yy_xx_flush              )
);

地址比较单元实例化

  1. 基本功能:

    • ct_lsu_pfu_sdb_cmp 单元可能用于比较存储在 GSDB 中的地址与当前处理的地址,以确定是否存在符合预取条件的步幅模式。
  2. 输入信号:

    • 包括控制信号(如 cp0_lsu_icg_en, cp0_yy_clk_en),复位信号(cpurst_b),以及 GSDB 特有的状态和配置信号(如 pfu_gsdb_addr0_act, pfu_gsdb_stride)。
    • 还包括与处理器管道相关的信号(如 ld_da_iid, ld_da_pfu_va),以及与提交指令相关的信号(rtu_yy_xx_commit0, rtu_yy_xx_commit0_iid 等)。
  3. 功能信号:

    • entry_stride_keep(传入的 monitor_with_confidence)可能用于在确定步幅有效时保持当前步幅状态。
    • entry_check_stride_success 可能表示步幅检测成功的情况。
  4. 时钟和时钟门控:

    • 使用 forever_cpuclk 作为持续的时钟源,pad_yy_icg_scan_en 用于扫描测试。
    • 时钟门控信号(如 entry_create_gateclk_en)控制模块的时钟流动,以优化能耗。

功能和重要性

  • 地址比较单元在步幅预取逻辑中非常关键,用于确定是否存在一致的访问模式,从而触发有效的预取操作。
  • 它能够根据实时的访问模式和指令提交情况调整预取策略,优化预取效果。
  • 此单元的实例化反映了处理器在预取策略实现中的复杂性和动态性。
//==========================================================
//                Generate state machine
//==========================================================
// &CombBeg; @134
always @( confidence_min
       or pfu_gsdb_normal_stride
       or pfu_gsdb_create_vld
       or pfu_gsdb_addr_cmp_info_vld
       or pfu_gpfb_vld
       or pfu_gsdb_state[3:0]
       or pfu_gsdb_check_stride_success)
begin
pfu_gsdb_next_state[3:0]  = IDLE;
case(pfu_gsdb_state[3:0])
  IDLE:
    if(pfu_gsdb_create_vld)
      pfu_gsdb_next_state[3:0]  = GET_STRIDE;
    else
      pfu_gsdb_next_state[3:0]  = IDLE;
  GET_STRIDE:
    if(pfu_gsdb_addr_cmp_info_vld &&  pfu_gsdb_normal_stride)
      pfu_gsdb_next_state[3:0]  = CHECK_STRIDE;
    else
      pfu_gsdb_next_state[3:0]  = GET_STRIDE;
  CHECK_STRIDE:
    if(pfu_gsdb_addr_cmp_info_vld &&  pfu_gsdb_check_stride_success)
      pfu_gsdb_next_state[3:0]  = MONITOR_STRIDE;
    else if(pfu_gsdb_addr_cmp_info_vld &&  !pfu_gsdb_check_stride_success)
      pfu_gsdb_next_state[3:0]  = GET_STRIDE;
    else
      pfu_gsdb_next_state[3:0]  = CHECK_STRIDE;
  MONITOR_STRIDE:
    if(pfu_gsdb_addr_cmp_info_vld
          &&  (!pfu_gsdb_check_stride_success
               && confidence_min
              ||  !pfu_gpfb_vld))
      pfu_gsdb_next_state[3:0]  = GET_STRIDE;
    else
      pfu_gsdb_next_state[3:0]  = MONITOR_STRIDE;
  default:
    pfu_gsdb_next_state[3:0]  = IDLE;
endcase
// &CombEnd; @165
end
assign pfu_gsdb_state_is_get_stride     = pfu_gsdb_state[0];
assign pfu_gsdb_state_is_check_stride   = pfu_gsdb_state[1];
assign pfu_gsdb_state_is_monitor_stride = pfu_gsdb_state[2];

//==========================================================
//                    Set ld inst
//==========================================================
assign pfu_gsdb_pf_inst_vld   = pfu_gsdb_vld
                                &&  ld_da_pfu_pf_inst_vld;
assign pfu_gsdb_addr0_act     = pfu_gsdb_newest_pf_inst_older_than_ld_da
                                &&  (!pfu_gsdb_state_is_get_stride
                                    ||  ld_da_pfu_act_vld);
//==========================================================
//              Generate create gsdb signal
//==========================================================
assign pfu_gsdb_create_vld          = !pfu_gsdb_vld
                                      &&  cp0_yy_dcache_pref_en;
assign pfu_gsdb_create_dp_vld       = pfu_gsdb_create_vld;
assign pfu_gsdb_create_gateclk_en   = pfu_gsdb_create_vld;
//==========================================================
//              pop confidence ctrl 
//==========================================================
assign confidence_max = (pfu_gsdb_pop_confidence[1:0] == 2'b11);
assign confidence_min = (pfu_gsdb_pop_confidence[1:0] == 2'b00);

assign confidence_reset   = pfu_gsdb_state_is_check_stride
                            && pfu_gsdb_addr_cmp_info_vld
                            && pfu_gsdb_check_stride_success;  

assign confidence_sub_vld = pfu_gsdb_state_is_monitor_stride
                            && pfu_gsdb_addr_cmp_info_vld
                            && !pfu_gsdb_check_stride_success  
                            && !confidence_min;   

assign confidence_add_vld = pfu_gsdb_state_is_monitor_stride
                            && pfu_gsdb_addr_cmp_info_vld
                            && pfu_gsdb_check_stride_success  
                            && !confidence_max;

assign monitor_with_confidence = pfu_gsdb_state_is_monitor_stride
                                 && pfu_gpfb_vld
                                 && !confidence_min; 

状态机生成逻辑

  1. 状态定义:

    • IDLE, GET_STRIDE, CHECK_STRIDE, MONITOR_STRIDE 分别代表不同的状态,用于步幅检测和预取操作。
  2. 状态转换:

    • IDLE 状态下,如果收到创建信号 pfu_gsdb_create_vld,则转移到 GET_STRIDE 状态。
    • GET_STRIDE 状态下,如果地址比较信息有效且为正常步幅,则转移到 CHECK_STRIDE 状态。
    • CHECK_STRIDE 状态下,根据地址比较结果和步幅检测成功与否决定下一状态。
    • MONITOR_STRIDE 状态下,根据地址比较信息、步幅检测成功与否和置信度最小值决定是否回到 GET_STRIDE 状态。
  3. 状态信号:

    • pfu_gsdb_state_is_get_stride, pfu_gsdb_state_is_check_stride, pfu_gsdb_state_is_monitor_stride 分别表示当前状态。

加载指令设置

  • pfu_gsdb_pf_inst_vldpfu_gsdb_addr0_act 根据当前状态和加载指令的相关信号设置。

创建 GSDB 信号

  • pfu_gsdb_create_vld, pfu_gsdb_create_dp_vld, pfu_gsdb_create_gateclk_en 控制 GSDB 的创建和时钟门控。

置信度控制

  • confidence_max, confidence_min 分别表示置信度的最大和最小值。
  • confidence_reset, confidence_sub_vld, confidence_add_vld 控制置信度的重置、减少和增加。
  • monitor_with_confidence 表示在 MONITOR_STRIDE 状态下并根据置信度最小值进行监控。

功能和重要性

  • 状态机逻辑允许 GSDB 动态地响应内存访问模式的变化,优化预取策略。
  • 置信度控制逻辑帮助 GSDB 判断预取操作的有效性,减少无效的预取操作。
  • 创建和时钟门控逻辑确保 GSDB 在适当的时候被激活和维护,优化能耗。
//==========================================================
//              Maintain newest iid
//==========================================================
//-------------------------older----------------------------
// &Instance("ct_rtu_compare_iid","x_lsu_gsdb_newest_inst_cmp"); @212
ct_rtu_compare_iid  x_lsu_gsdb_newest_inst_cmp (
  .x_iid0                                       (pfu_gsdb_newest_pf_inst_iid[6:0]            ),
  .x_iid0_older                                 (pfu_gsdb_newest_pf_inst_iid_older_than_ld_da),
  .x_iid1                                       (ld_da_iid[6:0]                              )
);

// &Connect( .x_iid0         (pfu_gsdb_newest_pf_inst_iid[6:0]), @213
//           .x_iid1         (ld_da_iid[6:0]     ), @214
//           .x_iid0_older   (pfu_gsdb_newest_pf_inst_iid_older_than_ld_da)); @215

assign pfu_gsdb_newest_pf_inst_cmit_hit0  = {rtu_yy_xx_commit0,rtu_yy_xx_commit0_iid[6:0]}
                                            ==  {1'b1,pfu_gsdb_newest_pf_inst_iid[6:0]};
assign pfu_gsdb_newest_pf_inst_cmit_hit1  = {rtu_yy_xx_commit1,rtu_yy_xx_commit1_iid[6:0]}
                                            ==  {1'b1,pfu_gsdb_newest_pf_inst_iid[6:0]};
assign pfu_gsdb_newest_pf_inst_cmit_hit2  = {rtu_yy_xx_commit2,rtu_yy_xx_commit2_iid[6:0]}
                                            ==  {1'b1,pfu_gsdb_newest_pf_inst_iid[6:0]};

assign pfu_gsdb_newest_pf_inst_cmit_set   = (pfu_gsdb_newest_pf_inst_cmit_hit0
                                                ||  pfu_gsdb_newest_pf_inst_cmit_hit1
                                                ||  pfu_gsdb_newest_pf_inst_cmit_hit2)
                                            &&  pfu_gsdb_newest_pf_inst_vld;

assign pfu_gsdb_newest_pf_inst_older_than_ld_da = pfu_gsdb_newest_pf_inst_vld
                                                  &&  (pfu_gsdb_newest_pf_inst_iid_older_than_ld_da
                                                      ||  pfu_gsdb_newest_pf_inst_cmit);

//-------------------newest_pf_inst_set---------------------
assign pfu_gsdb_newest_pf_inst_set  = pfu_gsdb_vld
                                      &&  pfu_gsdb_pf_inst_vld
                                      &&  (!pfu_gsdb_newest_pf_inst_vld
                                          ||  pfu_gsdb_newest_pf_inst_older_than_ld_da);

assign pfu_gsdb_newest_pf_inst_flush_uncmit = rtu_yy_xx_flush
                                              &&  !pfu_gsdb_newest_pf_inst_cmit;

//==========================================================
//              Generate gpfb signal
//==========================================================
assign pfu_gsdb_gpfb_create_vld     = pfu_gsdb_state_is_check_stride
                                      &&  pfu_gsdb_addr_cmp_info_vld
                                      &&  pfu_gsdb_check_stride_success;

assign pfu_gsdb_gpfb_pop_req        = pfu_gsdb_state_is_monitor_stride
                                      &&  pfu_gsdb_addr_cmp_info_vld
                                      &&  confidence_min
                                      &&  !pfu_gsdb_check_stride_success;

全局步幅检测缓冲区(GSDB)中维护最新指令ID(IID)的逻辑,以及如何生成与全局预取缓冲区(GPFB)相关的信号。

维护最新IID逻辑

  1. IID比较:

    • 使用 ct_rtu_compare_iid 实例比较当前最新的预取指令ID(pfu_gsdb_newest_pf_inst_iid)和加载指令的ID(ld_da_iid),以确定哪个是较旧的。
  2. 提交命中标志:

    • pfu_gsdb_newest_pf_inst_cmit_hit0, pfu_gsdb_newest_pf_inst_cmit_hit1, pfu_gsdb_newest_pf_inst_cmit_hit2 分别用于检测最新的预取指令ID是否与提交的指令ID匹配。
  3. 设置最新的预取指令提交标志:

    • pfu_gsdb_newest_pf_inst_cmit_set 在最新的预取指令ID与任一提交的指令ID匹配时设置。
  4. 最新预取指令ID是否早于加载指令:

    • pfu_gsdb_newest_pf_inst_older_than_ld_da 表示最新的预取指令ID是否早于加载指令的ID。
  5. 更新最新预取指令ID:

    • pfu_gsdb_newest_pf_inst_set 在当前状态有效且有新的预取指令ID时设置。
  6. 未提交的指令刷新:

    • pfu_gsdb_newest_pf_inst_flush_uncmit 在流水线刷新且最新的预取指令未提交时设置。

生成GPFB信号

  1. 创建GPFB条目:

    • pfu_gsdb_gpfb_create_vldCHECK_STRIDE 状态且地址比较信息有效并且步幅检测成功时设置。
  2. GPFB弹出请求:

    • pfu_gsdb_gpfb_pop_reqMONITOR_STRIDE 状态且地址比较信息有效、置信度最小且步幅检测不成功时设置。

功能和重要性

  • 维护最新的预取指令ID对于确保GSDB准确地跟踪程序的内存访问模式至关重要。
  • 提交命中和未提交刷新逻辑有助于及时更新GSDB的状态,确保预取策略与程序执行同步。
  • 生成GPFB信号的逻辑确保在适当的时机创建和弹出GPFB条目,优化预取操作的效率和有效性。