You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1089 lines
40 KiB
Verilog
1089 lines
40 KiB
Verilog
// © IBM Corp. 2020
|
|
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
|
|
// the terms below; you may not use the files in this repository except in
|
|
// compliance with the License as modified.
|
|
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Modified Terms:
|
|
//
|
|
// 1) For the purpose of the patent license granted to you in Section 3 of the
|
|
// License, the "Work" hereby includes implementations of the work of authorship
|
|
// in physical form.
|
|
//
|
|
// 2) Notwithstanding any terms to the contrary in the License, any licenses
|
|
// necessary for implementation of the Work that are available from OpenPOWER
|
|
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
|
|
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
|
|
// of the EULA.
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, the reference design
|
|
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
|
|
// for the specific language governing permissions and limitations under the License.
|
|
//
|
|
// Additional rights, including the ability to physically implement a softcore that
|
|
// is compliant with the required sections of the Power ISA Specification, are
|
|
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
|
|
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
|
|
|
|
`timescale 1 ns / 1 ns
|
|
|
|
// Description: XU Pervasive
|
|
//
|
|
//*****************************************************************************
|
|
|
|
`include "tri_a2o.vh"
|
|
|
|
module lq_perv(
|
|
vdd,
|
|
gnd,
|
|
clk,
|
|
rst,
|
|
pc_lq_trace_bus_enable,
|
|
pc_lq_debug_mux1_ctrls,
|
|
pc_lq_debug_mux2_ctrls,
|
|
pc_lq_instr_trace_mode,
|
|
pc_lq_instr_trace_tid,
|
|
debug_bus_in,
|
|
coretrace_ctrls_in,
|
|
lq_debug_bus0,
|
|
debug_bus_out,
|
|
coretrace_ctrls_out,
|
|
pc_lq_event_bus_enable,
|
|
pc_lq_event_count_mode,
|
|
ctl_perv_spr_lesr1,
|
|
ctl_perv_spr_lesr2,
|
|
ctl_perv_ex6_perf_events,
|
|
ctl_perv_stq4_perf_events,
|
|
ctl_perv_dir_perf_events,
|
|
lsq_perv_ex7_events,
|
|
lsq_perv_ldq_events,
|
|
lsq_perv_stq_events,
|
|
lsq_perv_odq_events,
|
|
xu_lq_spr_msr_pr,
|
|
xu_lq_spr_msr_gs,
|
|
event_bus_in,
|
|
event_bus_out,
|
|
pc_lq_sg_3,
|
|
pc_lq_func_sl_thold_3,
|
|
pc_lq_func_slp_sl_thold_3,
|
|
pc_lq_func_nsl_thold_3,
|
|
pc_lq_func_slp_nsl_thold_3,
|
|
pc_lq_gptr_sl_thold_3,
|
|
pc_lq_abst_sl_thold_3,
|
|
pc_lq_abst_slp_sl_thold_3,
|
|
pc_lq_time_sl_thold_3,
|
|
pc_lq_repr_sl_thold_3,
|
|
pc_lq_bolt_sl_thold_3,
|
|
pc_lq_cfg_slp_sl_thold_3,
|
|
pc_lq_regf_slp_sl_thold_3,
|
|
pc_lq_cfg_sl_thold_3,
|
|
pc_lq_ary_nsl_thold_3,
|
|
pc_lq_ary_slp_nsl_thold_3,
|
|
pc_lq_fce_3,
|
|
pc_lq_ccflush_dc,
|
|
pc_lq_bo_enable_3,
|
|
an_ac_scan_diag_dc,
|
|
bo_enable_2,
|
|
sg_2,
|
|
fce_2,
|
|
func_sl_thold_2,
|
|
func_slp_sl_thold_2,
|
|
func_nsl_thold_2,
|
|
func_slp_nsl_thold_2,
|
|
abst_sl_thold_2,
|
|
abst_slp_sl_thold_2,
|
|
time_sl_thold_2,
|
|
repr_sl_thold_2,
|
|
bolt_sl_thold_2,
|
|
cfg_slp_sl_thold_2,
|
|
regf_slp_sl_thold_2,
|
|
ary_nsl_thold_2,
|
|
ary_slp_nsl_thold_2,
|
|
cfg_sl_thold_2,
|
|
clkoff_dc_b,
|
|
d_mode_dc,
|
|
delay_lclkr_dc,
|
|
mpw1_dc_b,
|
|
mpw2_dc_b,
|
|
g6t_clkoff_dc_b,
|
|
g6t_d_mode_dc,
|
|
g6t_delay_lclkr_dc,
|
|
g6t_mpw1_dc_b,
|
|
g6t_mpw2_dc_b,
|
|
g8t_clkoff_dc_b,
|
|
g8t_d_mode_dc,
|
|
g8t_delay_lclkr_dc,
|
|
g8t_mpw1_dc_b,
|
|
g8t_mpw2_dc_b,
|
|
cam_clkoff_dc_b,
|
|
cam_d_mode_dc,
|
|
cam_delay_lclkr_dc,
|
|
cam_act_dis_dc,
|
|
cam_mpw1_dc_b,
|
|
cam_mpw2_dc_b,
|
|
gptr_scan_in,
|
|
gptr_scan_out,
|
|
func_scan_in,
|
|
func_scan_out
|
|
);
|
|
|
|
inout vdd;
|
|
inout gnd;
|
|
input clk;
|
|
input rst;
|
|
|
|
// Pervasive Debug Control
|
|
input pc_lq_trace_bus_enable;
|
|
input [0:10] pc_lq_debug_mux1_ctrls;
|
|
input [0:10] pc_lq_debug_mux2_ctrls;
|
|
input pc_lq_instr_trace_mode;
|
|
input [0:`THREADS-1] pc_lq_instr_trace_tid;
|
|
|
|
// Pass Thru Debug Trace Bus
|
|
input [0:31] debug_bus_in;
|
|
input [0:3] coretrace_ctrls_in;
|
|
|
|
// Debug Data
|
|
input [0:31] lq_debug_bus0;
|
|
|
|
// Outputs
|
|
output [0:31] debug_bus_out;
|
|
output [0:3] coretrace_ctrls_out;
|
|
|
|
// Pervasive Performance Event Control
|
|
input pc_lq_event_bus_enable;
|
|
input [0:2] pc_lq_event_count_mode;
|
|
input [0:23] ctl_perv_spr_lesr1;
|
|
input [0:23] ctl_perv_spr_lesr2;
|
|
input [0:18+`THREADS-1] ctl_perv_ex6_perf_events;
|
|
input [0:6+`THREADS-1] ctl_perv_stq4_perf_events;
|
|
input [0:(`THREADS*3)+1] ctl_perv_dir_perf_events;
|
|
input [0:`THREADS-1] lsq_perv_ex7_events;
|
|
input [0:(2*`THREADS)+3] lsq_perv_ldq_events;
|
|
input [0:(3*`THREADS)+2] lsq_perv_stq_events;
|
|
input [0:4+`THREADS-1] lsq_perv_odq_events;
|
|
|
|
input [0:`THREADS-1] xu_lq_spr_msr_pr;
|
|
input [0:`THREADS-1] xu_lq_spr_msr_gs;
|
|
|
|
// Performance Event Outputs
|
|
input [0:(4*`THREADS)-1] event_bus_in;
|
|
output [0:(4*`THREADS)-1] event_bus_out;
|
|
|
|
// Pervasive Clock Controls
|
|
input pc_lq_sg_3;
|
|
input pc_lq_func_sl_thold_3;
|
|
input pc_lq_func_slp_sl_thold_3;
|
|
input pc_lq_func_nsl_thold_3;
|
|
input pc_lq_func_slp_nsl_thold_3;
|
|
input pc_lq_gptr_sl_thold_3;
|
|
input pc_lq_abst_sl_thold_3;
|
|
input pc_lq_abst_slp_sl_thold_3;
|
|
input pc_lq_time_sl_thold_3;
|
|
input pc_lq_repr_sl_thold_3;
|
|
input pc_lq_bolt_sl_thold_3;
|
|
input pc_lq_cfg_slp_sl_thold_3;
|
|
input pc_lq_regf_slp_sl_thold_3;
|
|
input pc_lq_cfg_sl_thold_3;
|
|
input pc_lq_ary_nsl_thold_3;
|
|
input pc_lq_ary_slp_nsl_thold_3;
|
|
input pc_lq_fce_3;
|
|
input pc_lq_ccflush_dc;
|
|
input pc_lq_bo_enable_3;
|
|
input an_ac_scan_diag_dc;
|
|
output bo_enable_2;
|
|
output sg_2;
|
|
output fce_2;
|
|
output func_sl_thold_2;
|
|
output func_slp_sl_thold_2;
|
|
output func_nsl_thold_2;
|
|
output func_slp_nsl_thold_2;
|
|
output abst_sl_thold_2;
|
|
output abst_slp_sl_thold_2;
|
|
output time_sl_thold_2;
|
|
output repr_sl_thold_2;
|
|
output bolt_sl_thold_2;
|
|
output cfg_slp_sl_thold_2;
|
|
output regf_slp_sl_thold_2;
|
|
output ary_nsl_thold_2;
|
|
output ary_slp_nsl_thold_2;
|
|
output cfg_sl_thold_2;
|
|
output clkoff_dc_b;
|
|
output d_mode_dc;
|
|
output [0:9] delay_lclkr_dc;
|
|
output [0:9] mpw1_dc_b;
|
|
output mpw2_dc_b;
|
|
output g6t_clkoff_dc_b;
|
|
output g6t_d_mode_dc;
|
|
output [0:4] g6t_delay_lclkr_dc;
|
|
output [0:4] g6t_mpw1_dc_b;
|
|
output g6t_mpw2_dc_b;
|
|
output g8t_clkoff_dc_b;
|
|
output g8t_d_mode_dc;
|
|
output [0:4] g8t_delay_lclkr_dc;
|
|
output [0:4] g8t_mpw1_dc_b;
|
|
output g8t_mpw2_dc_b;
|
|
output cam_clkoff_dc_b;
|
|
output cam_d_mode_dc;
|
|
output [0:4] cam_delay_lclkr_dc;
|
|
output cam_act_dis_dc;
|
|
output [0:4] cam_mpw1_dc_b;
|
|
output cam_mpw2_dc_b;
|
|
(* pin_data="PIN_FUNCTION=/SCAN_IN/" *)
|
|
input gptr_scan_in;
|
|
(* pin_data="PIN_FUNCTION=/SCAN_OUT/" *)
|
|
output gptr_scan_out;
|
|
(* pin_data="PIN_FUNCTION=/SCAN_IN/" *)
|
|
input func_scan_in;
|
|
(* pin_data="PIN_FUNCTION=/SCAN_OUT/" *)
|
|
output func_scan_out;
|
|
|
|
//--------------------------
|
|
// signals
|
|
//--------------------------
|
|
wire [0:4] gptr_siv;
|
|
wire [0:4] gptr_sov;
|
|
wire perv_sg_2;
|
|
wire gptr_sl_thold_2;
|
|
wire gptr_sl_thold_1;
|
|
wire sg_1;
|
|
wire gptr_sl_thold_0;
|
|
wire sg_0;
|
|
wire g6t_clkoff_dc_b_int;
|
|
wire g6t_d_mode_dc_int;
|
|
wire [0:4] g6t_delay_lclkr_dc_int;
|
|
wire g6t_act_dis_dc_int;
|
|
wire [0:4] g6t_mpw1_dc_b_int;
|
|
wire g6t_mpw2_dc_b_int;
|
|
wire g8t_clkoff_dc_b_int;
|
|
wire g8t_d_mode_dc_int;
|
|
wire [0:4] g8t_delay_lclkr_dc_int;
|
|
wire g8t_act_dis_dc_int;
|
|
wire [0:4] g8t_mpw1_dc_b_int;
|
|
wire g8t_mpw2_dc_b_int;
|
|
wire cam_clkoff_dc_b_int;
|
|
wire cam_d_mode_dc_int;
|
|
wire [0:4] cam_delay_lclkr_dc_int;
|
|
wire cam_act_dis_ac_int;
|
|
wire [0:4] cam_mpw1_dc_b_int;
|
|
wire cam_mpw2_dc_b_int;
|
|
wire func_slp_sl_thold_2_int;
|
|
wire func_slp_sl_thold_1;
|
|
wire func_slp_sl_thold_0;
|
|
wire func_slp_sl_thold_0_b;
|
|
wire func_slp_sl_force;
|
|
wire [0:1] clkoff_dc_b_int;
|
|
wire [0:1] d_mode_dc_int;
|
|
wire [0:1] act_dis_dc_int;
|
|
wire [0:9] delay_lclkr_dc_int;
|
|
wire [0:9] mpw1_dc_b_int;
|
|
wire [0:1] mpw2_dc_b_int;
|
|
wire pc_lq_trace_bus_enable_q;
|
|
wire [0:10] pc_lq_debug_mux1_ctrls_q;
|
|
wire [0:10] pc_lq_debug_mux2_ctrls_q;
|
|
wire pc_lq_instr_trace_mode_q;
|
|
wire [0:`THREADS-1] pc_lq_instr_trace_tid_q;
|
|
wire pc_lq_event_bus_enable_q;
|
|
wire [0:2] pc_lq_event_count_mode_q;
|
|
wire [0:31] lq_dbg_data_mux1[0:31];
|
|
wire [0:31] lq_dbg_data_mux2[0:31];
|
|
wire [0:31] lq_mux1_debug_data_in;
|
|
wire [0:3] lq_mux1_coretrace_in;
|
|
wire [0:31] lq_mux1_debug_data_out_d;
|
|
wire [0:31] lq_mux1_debug_data_out_q;
|
|
wire [0:3] lq_mux1_coretrace_out_d;
|
|
wire [0:3] lq_mux1_coretrace_out_q;
|
|
wire [0:31] lq_mux2_debug_data_in;
|
|
wire [0:3] lq_mux2_coretrace_in;
|
|
wire [0:31] lq_mux2_debug_data_out_d;
|
|
wire [0:31] lq_mux2_debug_data_out_q;
|
|
wire [0:3] lq_mux2_coretrace_out_d;
|
|
wire [0:3] lq_mux2_coretrace_out_q;
|
|
wire [0:`THREADS-1] spr_msr_gs_d;
|
|
wire [0:`THREADS-1] spr_msr_gs_q;
|
|
wire [0:`THREADS-1] spr_msr_pr_d;
|
|
wire [0:`THREADS-1] spr_msr_pr_q;
|
|
wire [0:47] perf_event_mux_ctrl;
|
|
wire [0:`THREADS-1] perf_event_en_d;
|
|
wire [0:`THREADS-1] perf_event_en_q;
|
|
wire [0:(4*`THREADS)-1] perf_event_data_d;
|
|
wire [0:(4*`THREADS)-1] perf_event_data_q;
|
|
wire [0:17] ex6_perf_events[0:`THREADS-1];
|
|
wire [0:5] stq4_perf_events[0:`THREADS-1];
|
|
wire [0:3] odq_perf_events[0:`THREADS-1];
|
|
wire [0:4] dir_perf_events[0:`THREADS-1];
|
|
wire [0:5] stq_perf_events[0:`THREADS-1];
|
|
wire [0:5] ldq_perf_events[0:`THREADS-1];
|
|
wire [1:63] lq_perf_events[0:`THREADS-1];
|
|
wire [1:63] lq_events_en[0:`THREADS-1];
|
|
|
|
//--------------------------
|
|
// register constants
|
|
//--------------------------
|
|
parameter pc_lq_trace_bus_enable_offset = 0;
|
|
parameter pc_lq_debug_mux1_ctrls_offset = pc_lq_trace_bus_enable_offset + 1;
|
|
parameter pc_lq_debug_mux2_ctrls_offset = pc_lq_debug_mux1_ctrls_offset + 11;
|
|
parameter pc_lq_instr_trace_mode_offset = pc_lq_debug_mux2_ctrls_offset + 11;
|
|
parameter pc_lq_instr_trace_tid_offset = pc_lq_instr_trace_mode_offset + 1;
|
|
parameter lq_mux1_debug_data_out_offset = pc_lq_instr_trace_tid_offset + `THREADS;
|
|
parameter lq_mux1_coretrace_out_offset = lq_mux1_debug_data_out_offset + 32;
|
|
parameter lq_mux2_debug_data_out_offset = lq_mux1_coretrace_out_offset + 4;
|
|
parameter lq_mux2_coretrace_out_offset = lq_mux2_debug_data_out_offset + 32;
|
|
parameter spr_msr_gs_offset = lq_mux2_coretrace_out_offset + 4;
|
|
parameter spr_msr_pr_offset = spr_msr_gs_offset + `THREADS;
|
|
parameter pc_lq_event_bus_enable_offset = spr_msr_pr_offset + `THREADS;
|
|
parameter perf_event_en_offset = pc_lq_event_bus_enable_offset + 1;
|
|
parameter perf_event_data_offset = perf_event_en_offset + `THREADS;
|
|
parameter pc_lq_event_count_mode_offset = perf_event_data_offset + (4*`THREADS);
|
|
parameter scan_right = pc_lq_event_count_mode_offset + 3 - 1;
|
|
|
|
wire tiup;
|
|
wire tidn;
|
|
wire [0:scan_right] siv;
|
|
wire [0:scan_right] sov;
|
|
(* analysis_not_referenced="true" *)
|
|
wire unused;
|
|
|
|
assign tiup = 1;
|
|
assign tidn = 0;
|
|
assign unused = (|perf_event_mux_ctrl) | clkoff_dc_b_int[1] | d_mode_dc_int[1] | act_dis_dc_int[1] | mpw2_dc_b_int[1] |
|
|
g6t_act_dis_dc_int | g8t_act_dis_dc_int | cam_act_dis_ac_int;
|
|
|
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
// Debug Bus Control Logic
|
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
|
|
generate
|
|
begin : dbgData
|
|
genvar bus;
|
|
for (bus=0; bus<32; bus=bus+1) begin : dbgData
|
|
assign lq_dbg_data_mux1[bus] = lq_debug_bus0;
|
|
assign lq_dbg_data_mux2[bus] = lq_debug_bus0;
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign lq_mux1_debug_data_in = debug_bus_in;
|
|
assign lq_mux1_coretrace_in = coretrace_ctrls_in;
|
|
|
|
tri_debug_mux32 dbgMux1(
|
|
.select_bits(pc_lq_debug_mux1_ctrls_q),
|
|
.trace_data_in(lq_mux1_debug_data_in),
|
|
.coretrace_ctrls_in(lq_mux1_coretrace_in),
|
|
.dbg_group0(lq_dbg_data_mux1[0]),
|
|
.dbg_group1(lq_dbg_data_mux1[1]),
|
|
.dbg_group2(lq_dbg_data_mux1[2]),
|
|
.dbg_group3(lq_dbg_data_mux1[3]),
|
|
.dbg_group4(lq_dbg_data_mux1[4]),
|
|
.dbg_group5(lq_dbg_data_mux1[5]),
|
|
.dbg_group6(lq_dbg_data_mux1[6]),
|
|
.dbg_group7(lq_dbg_data_mux1[7]),
|
|
.dbg_group8(lq_dbg_data_mux1[8]),
|
|
.dbg_group9(lq_dbg_data_mux1[9]),
|
|
.dbg_group10(lq_dbg_data_mux1[10]),
|
|
.dbg_group11(lq_dbg_data_mux1[11]),
|
|
.dbg_group12(lq_dbg_data_mux1[12]),
|
|
.dbg_group13(lq_dbg_data_mux1[13]),
|
|
.dbg_group14(lq_dbg_data_mux1[14]),
|
|
.dbg_group15(lq_dbg_data_mux1[15]),
|
|
.dbg_group16(lq_dbg_data_mux1[16]),
|
|
.dbg_group17(lq_dbg_data_mux1[17]),
|
|
.dbg_group18(lq_dbg_data_mux1[18]),
|
|
.dbg_group19(lq_dbg_data_mux1[19]),
|
|
.dbg_group20(lq_dbg_data_mux1[20]),
|
|
.dbg_group21(lq_dbg_data_mux1[21]),
|
|
.dbg_group22(lq_dbg_data_mux1[22]),
|
|
.dbg_group23(lq_dbg_data_mux1[23]),
|
|
.dbg_group24(lq_dbg_data_mux1[24]),
|
|
.dbg_group25(lq_dbg_data_mux1[25]),
|
|
.dbg_group26(lq_dbg_data_mux1[26]),
|
|
.dbg_group27(lq_dbg_data_mux1[27]),
|
|
.dbg_group28(lq_dbg_data_mux1[28]),
|
|
.dbg_group29(lq_dbg_data_mux1[29]),
|
|
.dbg_group30(lq_dbg_data_mux1[30]),
|
|
.dbg_group31(lq_dbg_data_mux1[31]),
|
|
.trace_data_out(lq_mux1_debug_data_out_d),
|
|
.coretrace_ctrls_out(lq_mux1_coretrace_out_d)
|
|
);
|
|
|
|
assign lq_mux2_debug_data_in = lq_mux1_debug_data_out_q;
|
|
assign lq_mux2_coretrace_in = lq_mux1_coretrace_out_q;
|
|
|
|
tri_debug_mux32 dbgmux2(
|
|
.select_bits(pc_lq_debug_mux2_ctrls_q),
|
|
.trace_data_in(lq_mux2_debug_data_in),
|
|
.coretrace_ctrls_in(lq_mux2_coretrace_in),
|
|
.dbg_group0(lq_dbg_data_mux2[0]),
|
|
.dbg_group1(lq_dbg_data_mux2[1]),
|
|
.dbg_group2(lq_dbg_data_mux2[2]),
|
|
.dbg_group3(lq_dbg_data_mux2[3]),
|
|
.dbg_group4(lq_dbg_data_mux2[4]),
|
|
.dbg_group5(lq_dbg_data_mux2[5]),
|
|
.dbg_group6(lq_dbg_data_mux2[6]),
|
|
.dbg_group7(lq_dbg_data_mux2[7]),
|
|
.dbg_group8(lq_dbg_data_mux2[8]),
|
|
.dbg_group9(lq_dbg_data_mux2[9]),
|
|
.dbg_group10(lq_dbg_data_mux2[10]),
|
|
.dbg_group11(lq_dbg_data_mux2[11]),
|
|
.dbg_group12(lq_dbg_data_mux2[12]),
|
|
.dbg_group13(lq_dbg_data_mux2[13]),
|
|
.dbg_group14(lq_dbg_data_mux2[14]),
|
|
.dbg_group15(lq_dbg_data_mux2[15]),
|
|
.dbg_group16(lq_dbg_data_mux2[16]),
|
|
.dbg_group17(lq_dbg_data_mux2[17]),
|
|
.dbg_group18(lq_dbg_data_mux2[18]),
|
|
.dbg_group19(lq_dbg_data_mux2[19]),
|
|
.dbg_group20(lq_dbg_data_mux2[20]),
|
|
.dbg_group21(lq_dbg_data_mux2[21]),
|
|
.dbg_group22(lq_dbg_data_mux2[22]),
|
|
.dbg_group23(lq_dbg_data_mux2[23]),
|
|
.dbg_group24(lq_dbg_data_mux2[24]),
|
|
.dbg_group25(lq_dbg_data_mux2[25]),
|
|
.dbg_group26(lq_dbg_data_mux2[26]),
|
|
.dbg_group27(lq_dbg_data_mux2[27]),
|
|
.dbg_group28(lq_dbg_data_mux2[28]),
|
|
.dbg_group29(lq_dbg_data_mux2[29]),
|
|
.dbg_group30(lq_dbg_data_mux2[30]),
|
|
.dbg_group31(lq_dbg_data_mux2[31]),
|
|
.trace_data_out(lq_mux2_debug_data_out_d),
|
|
.coretrace_ctrls_out(lq_mux2_coretrace_out_d)
|
|
);
|
|
|
|
assign debug_bus_out = lq_mux2_debug_data_out_q;
|
|
assign coretrace_ctrls_out = lq_mux2_coretrace_out_q;
|
|
|
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
// Performance Events Control Logic
|
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
|
|
// MSR[GS] Guest State
|
|
// 1 => Processor is in Guest State
|
|
// 0 => Processor is in Hypervisor State
|
|
assign spr_msr_gs_d = xu_lq_spr_msr_gs;
|
|
|
|
// MSR[PR] Problem State
|
|
// 1 => Processor is in User Mode
|
|
// 0 => Processor is in Supervisor Mode
|
|
assign spr_msr_pr_d = xu_lq_spr_msr_pr;
|
|
|
|
// Processor State Control
|
|
assign perf_event_en_d = ( spr_msr_pr_q & {`THREADS{pc_lq_event_count_mode_q[0]}}) | // User
|
|
(~spr_msr_pr_q & spr_msr_gs_q & {`THREADS{pc_lq_event_count_mode_q[1]}}) | // Guest Supervisor
|
|
(~spr_msr_pr_q & ~spr_msr_gs_q & {`THREADS{pc_lq_event_count_mode_q[2]}}); // Hypervisor
|
|
|
|
// Muxing
|
|
assign perf_event_mux_ctrl = {ctl_perv_spr_lesr1, ctl_perv_spr_lesr2};
|
|
|
|
generate begin : TidPerf
|
|
genvar tid;
|
|
for (tid=0;tid<`THREADS;tid=tid+1) begin : TidPerf
|
|
// Generate Events Per Thread
|
|
assign ex6_perf_events[tid] = ctl_perv_ex6_perf_events[0:17] & {18{ctl_perv_ex6_perf_events[18+tid]}};
|
|
assign stq4_perf_events[tid] = ctl_perv_stq4_perf_events[0:5] & {6{ctl_perv_stq4_perf_events[6+tid]}};
|
|
assign odq_perf_events[tid] = lsq_perv_odq_events[0:3] & {4{lsq_perv_odq_events[4+tid]}};
|
|
assign dir_perf_events[tid] = {ctl_perv_dir_perf_events[0:1], ctl_perv_dir_perf_events[2+(0*`THREADS)+tid],
|
|
ctl_perv_dir_perf_events[2+(1*`THREADS)+tid], ctl_perv_dir_perf_events[2+(2*`THREADS)+tid]};
|
|
assign stq_perf_events[tid] = {lsq_perv_stq_events[0:2], lsq_perv_stq_events[3+(0*`THREADS)+tid],
|
|
lsq_perv_stq_events[3+(1*`THREADS)+tid], lsq_perv_stq_events[3+(2*`THREADS)+tid]};
|
|
assign ldq_perf_events[tid] = {lsq_perv_ldq_events[0:3], lsq_perv_ldq_events[4+(0*`THREADS)+tid],
|
|
lsq_perv_ldq_events[4+(1*`THREADS)+tid]};
|
|
|
|
// Tie Up all performance events
|
|
// (0) => => empty events, tied to 0 <-- Needs to always be 0
|
|
// (1) => => empty events, tied to 0
|
|
// (2) => => empty events, tied to 0
|
|
// (3) => => empty events, tied to 0
|
|
// (4) => => empty events, tied to 0
|
|
// (5) => => empty events, tied to 0
|
|
// (6) => perf_ex6_derat_attmpts => ctl_perv_ex6_perf_events(0)
|
|
// (7) => perf_ex6_derat_restarts => ctl_perv_ex6_perf_events(1)
|
|
assign lq_perf_events[tid][1:7] = {{5{1'b0}}, ex6_perf_events[tid][0:1]};
|
|
|
|
// (8) => perf_ex6_pfetch_iss => ctl_perv_ex6_perf_events(2)
|
|
// (9) => perf_ex6_pfetch_hit => ctl_perv_ex6_perf_events(3)
|
|
// (10) => perf_ex6_pfetch_emiss => ctl_perv_ex6_perf_events(4)
|
|
// (11) => perf_ex6_pfetch_ldq_full => ctl_perv_ex6_perf_events(5)
|
|
// (12) => perf_ex6_pfetch_ldq_hit => ctl_perv_ex6_perf_events(6)
|
|
// (13) => perf_ex6_pfetch_stq_restart => ctl_perv_ex6_perf_events(7)
|
|
// (14) => perf_ex6_pfetch_odq_restart => lsq_perv_ex7_events(0)
|
|
// (15) => perf_ex6_dir_restart => ctl_perv_ex6_perf_events(8)
|
|
assign lq_perf_events[tid][8:15] = {ex6_perf_events[tid][2:7], lsq_perv_ex7_events[tid], ex6_perf_events[tid][8]};
|
|
|
|
// (16) => perf_ex6_dec_restart => ctl_perv_ex6_perf_events(9)
|
|
// (17) => perf_ex6_wNComp_restart => ctl_perv_ex6_perf_events(10)
|
|
// (18) => perf_ex6_ldq_full => ctl_perv_ex6_perf_events(11)
|
|
// (19) => perf_ex6_ldq_hit => ctl_perv_ex6_perf_events(12)
|
|
// (20) => perf_ex6_lgq_full => ctl_perv_ex6_perf_events(13)
|
|
// (21) => perf_ex6_lgq_hit => ctl_perv_ex6_perf_events(14)
|
|
// (22) => perf_ex6_stq_sametid => ctl_perv_ex6_perf_events(15)
|
|
// (23) => perf_ex6_stq_difftid => ctl_perv_ex6_perf_events(16)
|
|
assign lq_perf_events[tid][16:23] = ex6_perf_events[tid][9:16];
|
|
|
|
// (24) => perf_dir_binv_val => ctl_perv_dir_perf_events(0)
|
|
// (25) => perf_dir_binv_hit => ctl_perv_dir_perf_events(1)
|
|
// (26) => perf_dir_binv_watchlost => ctl_perv_dir_perf_events(2+(0*`THREADS))
|
|
// (27) => perf_dir_evict_watchlost => ctl_perv_dir_perf_events(2+(1*`THREADS))
|
|
// (28) => perf_dir_interTid_watchlost => ctl_perv_dir_perf_events(2+(2*`THREADS))
|
|
// (29) => perf_stq_stores => ctl_perv_stq4_perf_events(0)
|
|
// (30) => perf_stq_store_miss => ctl_perv_stq4_perf_events(1)
|
|
// (31) => perf_stq_stcx_exec => ctl_perv_stq4_perf_events(2)
|
|
assign lq_perf_events[tid][24:31] = {dir_perf_events[tid], stq4_perf_events[tid][0:2]};
|
|
|
|
// (32) => perf_stq_stcx_fail => lsq_perv_stq_events(3+(0*`THREADS))
|
|
// (33) => perf_stq_axu_store => ctl_perv_stq4_perf_events(3)
|
|
// (34) => perf_stq_icswxr_nbusy => lsq_perv_stq_events(3+(1*`THREADS))
|
|
// (35) => perf_stq_icswxr_busy => lsq_perv_stq_events(3+(2*`THREADS))
|
|
// (36) => perf_stq_wclr => ctl_perv_stq4_perf_events(4)
|
|
// (37) => perf_stq_wclr_set => ctl_perv_stq4_perf_events(5)
|
|
// (38) => perf_ldq_cpl_larx => lsq_perv_ldq_events(4+(0*`THREADS))
|
|
// (39) => perf_ldq_rel_attmpt => lsq_perv_ldq_events(0)
|
|
assign lq_perf_events[tid][32:39] = {stq_perf_events[tid][3], stq4_perf_events[tid][3], stq_perf_events[tid][4:5], stq4_perf_events[tid][4:5],
|
|
ldq_perf_events[tid][4], ldq_perf_events[tid][0]};
|
|
|
|
// (40) => perf_ldq_rel_cmmt => lsq_perv_ldq_events(1)
|
|
// (41) => perf_ldq_rel_need_hole => lsq_perv_ldq_events(2)
|
|
// (42) => perf_stq_cmmt_attmpt => lsq_perv_stq_events(0)
|
|
// (43) => perf_stq_cmmt_val => lsq_perv_stq_events(1)
|
|
// (44) => perf_stq_need_hole => lsq_perv_stq_events(2)
|
|
// (45) => perf_ex6_align_flush => ctl_perv_ex6_perf_events(17)
|
|
// (46) => perf_ldq_cpl_binv => lsq_perv_ldq_events(4+(1*`THREADS))
|
|
// (47) => => lsq_perv_odq_events(0)
|
|
assign lq_perf_events[tid][40:47] = {ldq_perf_events[tid][1:2], stq_perf_events[tid][0:2], ex6_perf_events[tid][17], ldq_perf_events[tid][5],
|
|
odq_perf_events[tid][0]};
|
|
|
|
// (48) => => lsq_perv_odq_events(1)
|
|
// (49) => => lsq_perv_odq_events(2)
|
|
// (50) => => lsq_perv_odq_events(3)
|
|
// (51) => perf_ldq_rel_latency => lsq_perv_ldq_events(3)
|
|
// (52) => perf_com_loads => commit events, tied to 0
|
|
// (53) => perf_com_loadmiss => commit events, tied to 0
|
|
// (54) => perf_com_cinh_loads => commit events, tied to 0
|
|
// (55) => perf_com_load_fwd => commit events, tied to 0
|
|
assign lq_perf_events[tid][48:55] = {odq_perf_events[tid][1:3], ldq_perf_events[tid][3], {4{1'b0}}};
|
|
|
|
// (56) => perf_com_axu_load => commit events, tied to 0
|
|
// (57) => perf_com_dcbt_sent => commit events, tied to 0
|
|
// (58) => perf_com_dcbt_hit => commit events, tied to 0
|
|
// (59) => perf_com_watch_set => commit events, tied to 0
|
|
// (60) => perf_com_watch_dup => commit events, tied to 0
|
|
// (61) => perf_com_wchkall => commit events, tied to 0
|
|
// (62) => perf_com_wchkall_succ => commit events, tied to 0
|
|
// (63) => ex5_ld_gath_q => commit events, tied to 0
|
|
assign lq_perf_events[tid][56:63] = {8{1'b0}};
|
|
|
|
assign lq_events_en[tid] = lq_perf_events[tid] & {63{perf_event_en_q[tid]}};
|
|
|
|
tri_event_mux1t #(.EVENTS_IN(64)) perfMux(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.select_bits(perf_event_mux_ctrl[tid*24:(tid*24)+23]),
|
|
.unit_events_in(lq_events_en[tid]),
|
|
.event_bus_in(event_bus_in[tid*4:(tid*4)+3]),
|
|
.event_bus_out(perf_event_data_d[tid*4:(tid*4)+3])
|
|
);
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign event_bus_out = perf_event_data_q;
|
|
|
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
// Pervasive Clock Control Logic
|
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
|
|
tri_plat#(.WIDTH(18)) perv_3to2_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.flush(pc_lq_ccflush_dc),
|
|
.din({pc_lq_func_sl_thold_3,
|
|
pc_lq_func_slp_sl_thold_3,
|
|
pc_lq_gptr_sl_thold_3,
|
|
pc_lq_sg_3,
|
|
pc_lq_fce_3,
|
|
pc_lq_func_nsl_thold_3,
|
|
pc_lq_func_slp_nsl_thold_3,
|
|
pc_lq_abst_sl_thold_3,
|
|
pc_lq_abst_slp_sl_thold_3,
|
|
pc_lq_time_sl_thold_3,
|
|
pc_lq_ary_nsl_thold_3,
|
|
pc_lq_ary_slp_nsl_thold_3,
|
|
pc_lq_cfg_sl_thold_3,
|
|
pc_lq_repr_sl_thold_3,
|
|
pc_lq_bolt_sl_thold_3,
|
|
pc_lq_cfg_slp_sl_thold_3,
|
|
pc_lq_regf_slp_sl_thold_3,
|
|
pc_lq_bo_enable_3}),
|
|
.q({func_sl_thold_2,
|
|
func_slp_sl_thold_2_int,
|
|
gptr_sl_thold_2,
|
|
perv_sg_2,
|
|
fce_2,
|
|
func_nsl_thold_2,
|
|
func_slp_nsl_thold_2,
|
|
abst_sl_thold_2,
|
|
abst_slp_sl_thold_2,
|
|
time_sl_thold_2,
|
|
ary_nsl_thold_2,
|
|
ary_slp_nsl_thold_2,
|
|
cfg_sl_thold_2,
|
|
repr_sl_thold_2,
|
|
bolt_sl_thold_2,
|
|
cfg_slp_sl_thold_2,
|
|
regf_slp_sl_thold_2,
|
|
bo_enable_2})
|
|
);
|
|
|
|
assign sg_2 = perv_sg_2;
|
|
|
|
assign g6t_clkoff_dc_b = g6t_clkoff_dc_b_int;
|
|
assign g6t_d_mode_dc = g6t_d_mode_dc_int;
|
|
assign g6t_delay_lclkr_dc = g6t_delay_lclkr_dc_int;
|
|
assign g6t_mpw1_dc_b = g6t_mpw1_dc_b_int;
|
|
assign g6t_mpw2_dc_b = g6t_mpw2_dc_b_int;
|
|
|
|
assign g8t_clkoff_dc_b = g8t_clkoff_dc_b_int;
|
|
assign g8t_d_mode_dc = g8t_d_mode_dc_int;
|
|
assign g8t_delay_lclkr_dc = g8t_delay_lclkr_dc_int;
|
|
assign g8t_mpw1_dc_b = g8t_mpw1_dc_b_int;
|
|
assign g8t_mpw2_dc_b = g8t_mpw2_dc_b_int;
|
|
|
|
assign cam_clkoff_dc_b = cam_clkoff_dc_b_int;
|
|
assign cam_delay_lclkr_dc = cam_delay_lclkr_dc_int;
|
|
assign cam_act_dis_dc = 1'b0;
|
|
assign cam_d_mode_dc = cam_d_mode_dc_int;
|
|
assign cam_mpw1_dc_b = cam_mpw1_dc_b_int;
|
|
assign cam_mpw2_dc_b = cam_mpw2_dc_b_int;
|
|
|
|
assign func_slp_sl_thold_2 = func_slp_sl_thold_2_int;
|
|
assign clkoff_dc_b = clkoff_dc_b_int[0];
|
|
assign d_mode_dc = d_mode_dc_int[0];
|
|
assign delay_lclkr_dc = delay_lclkr_dc_int;
|
|
assign mpw1_dc_b = mpw1_dc_b_int;
|
|
assign mpw2_dc_b = mpw2_dc_b_int[0];
|
|
|
|
|
|
tri_plat#(.WIDTH(3)) perv_2to1_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.flush(pc_lq_ccflush_dc),
|
|
.din({gptr_sl_thold_2,
|
|
func_slp_sl_thold_2_int,
|
|
perv_sg_2}),
|
|
.q({gptr_sl_thold_1,
|
|
func_slp_sl_thold_1,
|
|
sg_1})
|
|
);
|
|
|
|
tri_plat#(.WIDTH(3)) perv_1to0_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.flush(pc_lq_ccflush_dc),
|
|
.din({gptr_sl_thold_1,
|
|
func_slp_sl_thold_1,
|
|
sg_1}),
|
|
.q({gptr_sl_thold_0,
|
|
func_slp_sl_thold_0,
|
|
sg_0})
|
|
);
|
|
|
|
tri_lcbor perv_lcbor_func_slp_sl(
|
|
.clkoff_b(clkoff_dc_b_int[0]),
|
|
.thold(func_slp_sl_thold_0),
|
|
.sg(sg_0),
|
|
.act_dis(tidn),
|
|
.force_t(func_slp_sl_force),
|
|
.thold_b(func_slp_sl_thold_0_b)
|
|
);
|
|
|
|
tri_lcbcntl_mac perv_lcbctrl_0(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.sg(sg_0),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.scan_in(gptr_siv[3]),
|
|
.scan_diag_dc(an_ac_scan_diag_dc),
|
|
.thold(gptr_sl_thold_0),
|
|
.clkoff_dc_b(clkoff_dc_b_int[0]),
|
|
.delay_lclkr_dc(delay_lclkr_dc_int[0:4]),
|
|
.act_dis_dc(act_dis_dc_int[0]),
|
|
.d_mode_dc(d_mode_dc_int[0]),
|
|
.mpw1_dc_b(mpw1_dc_b_int[0:4]),
|
|
.mpw2_dc_b(mpw2_dc_b_int[0]),
|
|
.scan_out(gptr_sov[3])
|
|
);
|
|
|
|
tri_lcbcntl_mac perv_lcbctrl_1(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.sg(sg_0),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.scan_in(gptr_siv[4]),
|
|
.scan_diag_dc(an_ac_scan_diag_dc),
|
|
.thold(gptr_sl_thold_0),
|
|
.clkoff_dc_b(clkoff_dc_b_int[1]),
|
|
.delay_lclkr_dc(delay_lclkr_dc_int[5:9]),
|
|
.act_dis_dc(act_dis_dc_int[1]),
|
|
.d_mode_dc(d_mode_dc_int[1]),
|
|
.mpw1_dc_b(mpw1_dc_b_int[5:9]),
|
|
.mpw2_dc_b(mpw2_dc_b_int[1]),
|
|
.scan_out(gptr_sov[4])
|
|
);
|
|
|
|
tri_lcbcntl_array_mac perv_lcbctrl_g6t_0(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.sg(sg_0),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.scan_in(gptr_siv[0]),
|
|
.scan_diag_dc(an_ac_scan_diag_dc),
|
|
.thold(gptr_sl_thold_0),
|
|
.clkoff_dc_b(g6t_clkoff_dc_b_int),
|
|
.delay_lclkr_dc(g6t_delay_lclkr_dc_int[0:4]),
|
|
.act_dis_dc(g6t_act_dis_dc_int),
|
|
.d_mode_dc(g6t_d_mode_dc_int),
|
|
.mpw1_dc_b(g6t_mpw1_dc_b_int[0:4]),
|
|
.mpw2_dc_b(g6t_mpw2_dc_b_int),
|
|
.scan_out(gptr_sov[0])
|
|
);
|
|
|
|
tri_lcbcntl_array_mac perv_lcbctrl_g8t_0(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.sg(sg_0),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.scan_in(gptr_siv[1]),
|
|
.scan_diag_dc(an_ac_scan_diag_dc),
|
|
.thold(gptr_sl_thold_0),
|
|
.clkoff_dc_b(g8t_clkoff_dc_b_int),
|
|
.delay_lclkr_dc(g8t_delay_lclkr_dc_int[0:4]),
|
|
.act_dis_dc(g8t_act_dis_dc_int),
|
|
.d_mode_dc(g8t_d_mode_dc_int),
|
|
.mpw1_dc_b(g8t_mpw1_dc_b_int[0:4]),
|
|
.mpw2_dc_b(g8t_mpw2_dc_b_int),
|
|
.scan_out(gptr_sov[1])
|
|
);
|
|
|
|
tri_lcbcntl_array_mac perv_lcbctrl_cam_0(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.sg(sg_0),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.scan_in(gptr_siv[2]),
|
|
.scan_diag_dc(an_ac_scan_diag_dc),
|
|
.thold(gptr_sl_thold_0),
|
|
.clkoff_dc_b(cam_clkoff_dc_b_int),
|
|
.delay_lclkr_dc(cam_delay_lclkr_dc_int[0:4]),
|
|
.act_dis_dc(cam_act_dis_ac_int),
|
|
.d_mode_dc(cam_d_mode_dc_int),
|
|
.mpw1_dc_b(cam_mpw1_dc_b_int[0:4]),
|
|
.mpw2_dc_b(cam_mpw2_dc_b_int),
|
|
.scan_out(gptr_sov[2])
|
|
);
|
|
|
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
// Registers
|
|
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) pc_lq_trace_bus_enable_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(tiup),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[pc_lq_trace_bus_enable_offset]),
|
|
.scout(sov[pc_lq_trace_bus_enable_offset]),
|
|
.din(pc_lq_trace_bus_enable),
|
|
.dout(pc_lq_trace_bus_enable_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(11), .INIT(0), .NEEDS_SRESET(1)) pc_lq_debug_mux1_ctrls_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_trace_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[pc_lq_debug_mux1_ctrls_offset:pc_lq_debug_mux1_ctrls_offset + 11 - 1]),
|
|
.scout(sov[pc_lq_debug_mux1_ctrls_offset:pc_lq_debug_mux1_ctrls_offset + 11 - 1]),
|
|
.din(pc_lq_debug_mux1_ctrls),
|
|
.dout(pc_lq_debug_mux1_ctrls_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(11), .INIT(0), .NEEDS_SRESET(1)) pc_lq_debug_mux2_ctrls_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_trace_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[pc_lq_debug_mux2_ctrls_offset:pc_lq_debug_mux2_ctrls_offset + 11 - 1]),
|
|
.scout(sov[pc_lq_debug_mux2_ctrls_offset:pc_lq_debug_mux2_ctrls_offset + 11 - 1]),
|
|
.din(pc_lq_debug_mux2_ctrls),
|
|
.dout(pc_lq_debug_mux2_ctrls_q)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) pc_lq_instr_trace_mode_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(tiup),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[pc_lq_instr_trace_mode_offset]),
|
|
.scout(sov[pc_lq_instr_trace_mode_offset]),
|
|
.din(pc_lq_instr_trace_mode),
|
|
.dout(pc_lq_instr_trace_mode_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) pc_lq_instr_trace_tid_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_trace_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[pc_lq_instr_trace_tid_offset:pc_lq_instr_trace_tid_offset + `THREADS - 1]),
|
|
.scout(sov[pc_lq_instr_trace_tid_offset:pc_lq_instr_trace_tid_offset + `THREADS - 1]),
|
|
.din(pc_lq_instr_trace_tid),
|
|
.dout(pc_lq_instr_trace_tid_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(32), .INIT(0), .NEEDS_SRESET(1)) lq_mux1_debug_data_out_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_trace_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[lq_mux1_debug_data_out_offset:lq_mux1_debug_data_out_offset + 32 - 1]),
|
|
.scout(sov[lq_mux1_debug_data_out_offset:lq_mux1_debug_data_out_offset + 32 - 1]),
|
|
.din(lq_mux1_debug_data_out_d),
|
|
.dout(lq_mux1_debug_data_out_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) lq_mux1_coretrace_out_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_trace_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[lq_mux1_coretrace_out_offset:lq_mux1_coretrace_out_offset + 4 - 1]),
|
|
.scout(sov[lq_mux1_coretrace_out_offset:lq_mux1_coretrace_out_offset + 4 - 1]),
|
|
.din(lq_mux1_coretrace_out_d),
|
|
.dout(lq_mux1_coretrace_out_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(32), .INIT(0), .NEEDS_SRESET(1)) lq_mux2_debug_data_out_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_trace_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[lq_mux2_debug_data_out_offset:lq_mux2_debug_data_out_offset + 32 - 1]),
|
|
.scout(sov[lq_mux2_debug_data_out_offset:lq_mux2_debug_data_out_offset + 32 - 1]),
|
|
.din(lq_mux2_debug_data_out_d),
|
|
.dout(lq_mux2_debug_data_out_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) lq_mux2_coretrace_out_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_trace_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[lq_mux2_coretrace_out_offset:lq_mux2_coretrace_out_offset + 4 - 1]),
|
|
.scout(sov[lq_mux2_coretrace_out_offset:lq_mux2_coretrace_out_offset + 4 - 1]),
|
|
.din(lq_mux2_coretrace_out_d),
|
|
.dout(lq_mux2_coretrace_out_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) spr_msr_gs_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(tiup),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[spr_msr_gs_offset:spr_msr_gs_offset + `THREADS - 1]),
|
|
.scout(sov[spr_msr_gs_offset:spr_msr_gs_offset + `THREADS - 1]),
|
|
.din(spr_msr_gs_d),
|
|
.dout(spr_msr_gs_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) spr_msr_pr_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(tiup),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[spr_msr_pr_offset:spr_msr_pr_offset + `THREADS - 1]),
|
|
.scout(sov[spr_msr_pr_offset:spr_msr_pr_offset + `THREADS - 1]),
|
|
.din(spr_msr_pr_d),
|
|
.dout(spr_msr_pr_q)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) pc_lq_event_bus_enable_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(tiup),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[pc_lq_event_bus_enable_offset]),
|
|
.scout(sov[pc_lq_event_bus_enable_offset]),
|
|
.din(pc_lq_event_bus_enable),
|
|
.dout(pc_lq_event_bus_enable_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`THREADS), .INIT(0), .NEEDS_SRESET(1)) perf_event_en_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_event_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[perf_event_en_offset:perf_event_en_offset + `THREADS - 1]),
|
|
.scout(sov[perf_event_en_offset:perf_event_en_offset + `THREADS - 1]),
|
|
.din(perf_event_en_d),
|
|
.dout(perf_event_en_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH((4*`THREADS)), .INIT(0), .NEEDS_SRESET(1)) perf_event_data_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_event_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[perf_event_data_offset:perf_event_data_offset + (4*`THREADS) - 1]),
|
|
.scout(sov[perf_event_data_offset:perf_event_data_offset + (4*`THREADS) - 1]),
|
|
.din(perf_event_data_d),
|
|
.dout(perf_event_data_q)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(3), .INIT(0), .NEEDS_SRESET(1)) pc_lq_event_count_mode_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.clk(clk),
|
|
.rst(rst),
|
|
.act(pc_lq_event_bus_enable_q),
|
|
.force_t(func_slp_sl_force),
|
|
.d_mode(d_mode_dc_int[0]),
|
|
.delay_lclkr(delay_lclkr_dc_int[0]),
|
|
.mpw1_b(mpw1_dc_b_int[0]),
|
|
.mpw2_b(mpw2_dc_b_int[0]),
|
|
.thold_b(func_slp_sl_thold_0_b),
|
|
.sg(sg_0),
|
|
.scin(siv[pc_lq_event_count_mode_offset:pc_lq_event_count_mode_offset + 3 - 1]),
|
|
.scout(sov[pc_lq_event_count_mode_offset:pc_lq_event_count_mode_offset + 3 - 1]),
|
|
.din(pc_lq_event_count_mode),
|
|
.dout(pc_lq_event_count_mode_q)
|
|
);
|
|
|
|
assign gptr_siv[0:4] = {gptr_sov[1:4], gptr_scan_in};
|
|
assign gptr_scan_out = gptr_sov[0];
|
|
assign siv[0:scan_right] = {sov[1:scan_right], func_scan_in};
|
|
assign func_scan_out = sov[0];
|
|
|
|
endmodule
|