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.
2127 lines
81 KiB
Verilog
2127 lines
81 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
|
|
|
|
//********************************************************************
|
|
//*
|
|
//* TITLE: IU Microcode
|
|
//*
|
|
//* NAME: iuq_uc.v
|
|
//*
|
|
//*********************************************************************
|
|
|
|
`include "tri_a2o.vh"
|
|
|
|
|
|
module iuq_uc(
|
|
vdd,
|
|
gnd,
|
|
nclk,
|
|
pc_iu_func_sl_thold_2,
|
|
pc_iu_sg_2,
|
|
tc_ac_ccflush_dc,
|
|
clkoff_b,
|
|
act_dis,
|
|
d_mode,
|
|
delay_lclkr,
|
|
mpw1_b,
|
|
mpw2_b,
|
|
scan_in,
|
|
scan_out,
|
|
iu_pc_err_ucode_illegal,
|
|
xu_iu_ucode_xer_val,
|
|
xu_iu_ucode_xer,
|
|
iu_flush,
|
|
br_iu_redirect,
|
|
cp_flush_into_uc,
|
|
cp_uc_np1_flush,
|
|
cp_uc_flush_ifar,
|
|
cp_uc_credit_free,
|
|
cp_flush,
|
|
uc_ic_hold,
|
|
uc_iu4_flush,
|
|
uc_iu4_flush_ifar,
|
|
ic_bp_iu2_val,
|
|
ic_bp_iu2_ifar,
|
|
ic_bp_iu2_2ucode,
|
|
ic_bp_iu2_2ucode_type,
|
|
ic_bp_iu2_error,
|
|
ic_bp_iu2_flush,
|
|
ic_bp_iu3_flush,
|
|
ic_bp_iu3_ecc_err,
|
|
ic_bp_iu2_0_instr,
|
|
ic_bp_iu2_1_instr,
|
|
ic_bp_iu2_2_instr,
|
|
ic_bp_iu2_3_instr,
|
|
bp_ib_iu3_val,
|
|
ib_uc_rdy,
|
|
uc_ib_iu3_invalid,
|
|
uc_ib_iu3_flush_all,
|
|
uc_ib_val,
|
|
uc_ib_done,
|
|
uc_ib_instr0,
|
|
uc_ib_instr1,
|
|
uc_ib_ifar0,
|
|
uc_ib_ifar1,
|
|
uc_ib_ext0,
|
|
uc_ib_ext1
|
|
);
|
|
|
|
|
|
inout vdd;
|
|
|
|
inout gnd;
|
|
|
|
(* pin_data="PIN_FUNCTION=/G_CLK/" *)
|
|
input [0:`NCLK_WIDTH-1] nclk;
|
|
input pc_iu_func_sl_thold_2;
|
|
input pc_iu_sg_2;
|
|
input tc_ac_ccflush_dc;
|
|
input clkoff_b;
|
|
input act_dis;
|
|
input d_mode;
|
|
input delay_lclkr;
|
|
input mpw1_b;
|
|
input mpw2_b;
|
|
|
|
(* pin_data="PIN_FUNCTION=/SCAN_IN/" *)
|
|
input scan_in;
|
|
|
|
(* pin_data="PIN_FUNCTION=/SCAN_OUT/" *)
|
|
output scan_out;
|
|
|
|
output iu_pc_err_ucode_illegal;
|
|
|
|
input xu_iu_ucode_xer_val;
|
|
input [57:63] xu_iu_ucode_xer;
|
|
|
|
input iu_flush;
|
|
input br_iu_redirect;
|
|
input cp_flush_into_uc;
|
|
input cp_uc_np1_flush;
|
|
input [43:61] cp_uc_flush_ifar;
|
|
input cp_uc_credit_free;
|
|
input cp_flush;
|
|
|
|
output uc_ic_hold;
|
|
|
|
output uc_iu4_flush;
|
|
output [62-`EFF_IFAR_WIDTH:61] uc_iu4_flush_ifar;
|
|
|
|
input [0:3] ic_bp_iu2_val;
|
|
input [62-`EFF_IFAR_WIDTH:61] ic_bp_iu2_ifar;
|
|
input ic_bp_iu2_2ucode;
|
|
input ic_bp_iu2_2ucode_type;
|
|
input ic_bp_iu2_error;
|
|
input ic_bp_iu2_flush;
|
|
input ic_bp_iu3_flush;
|
|
input ic_bp_iu3_ecc_err;
|
|
|
|
// iu2 instruction(0:31) + predecode(32:35); (32:33) = "01" when uCode
|
|
input [0:33] ic_bp_iu2_0_instr;
|
|
input [0:33] ic_bp_iu2_1_instr;
|
|
input [0:33] ic_bp_iu2_2_instr;
|
|
input [0:33] ic_bp_iu2_3_instr;
|
|
|
|
input [0:3] bp_ib_iu3_val;
|
|
|
|
input ib_uc_rdy;
|
|
|
|
output [0:3] uc_ib_iu3_invalid;
|
|
output uc_ib_iu3_flush_all;
|
|
output reg [0:1] uc_ib_val;
|
|
output reg uc_ib_done;
|
|
output reg [0:31] uc_ib_instr0;
|
|
output reg [0:31] uc_ib_instr1;
|
|
output reg [62-`EFF_IFAR_WIDTH:61] uc_ib_ifar0;
|
|
output reg [62-`EFF_IFAR_WIDTH:61] uc_ib_ifar1;
|
|
output reg [0:3] uc_ib_ext0; //RT, S1, S2, S3
|
|
output reg [0:3] uc_ib_ext1; //RT, S1, S2, S3
|
|
|
|
//@@ Signal Declarations
|
|
wire [1:78] get_address_pt;
|
|
wire force_ep;
|
|
wire fxm_type;
|
|
wire late_end;
|
|
wire [0:9] start_addr;
|
|
wire uc_legal;
|
|
wire xer_type;
|
|
|
|
parameter ucode_width = 72;
|
|
parameter uc_ifar = 20;
|
|
|
|
parameter iu3_val_offset = 0;
|
|
parameter iu3_ifar_offset = iu3_val_offset + 4;
|
|
parameter iu3_2ucode_offset = iu3_ifar_offset + `EFF_IFAR_WIDTH;
|
|
parameter iu3_2ucode_type_offset = iu3_2ucode_offset + 1;
|
|
parameter iu3_instr_offset = iu3_2ucode_type_offset + 1;
|
|
parameter iu_flush_offset = iu3_instr_offset + 136;
|
|
parameter br_hold_offset = iu_flush_offset + 1;
|
|
parameter flush_into_uc_offset = br_hold_offset + 1;
|
|
parameter np1_flush_offset = flush_into_uc_offset + 1;
|
|
parameter flush_ifar_offset = np1_flush_offset + 1;
|
|
parameter cp_flush_offset = flush_ifar_offset + 19;
|
|
parameter br_iu_redirect_offset = cp_flush_offset + 1;
|
|
parameter iu_pc_err_ucode_illegal_offset = br_iu_redirect_offset + 1;
|
|
parameter advance_buffers_offset = iu_pc_err_ucode_illegal_offset + 1;
|
|
parameter romvalid_offset = advance_buffers_offset + 1;
|
|
parameter rom_data_even_late_offset = romvalid_offset + 1;
|
|
parameter rom_data_odd_late_offset = rom_data_even_late_offset + 32;
|
|
parameter iu4_valid_offset = rom_data_odd_late_offset + 32;
|
|
parameter iu4_ifar_offset = iu4_valid_offset + 2;
|
|
parameter iu4_ext0_offset = iu4_ifar_offset + uc_ifar;
|
|
parameter iu4_ext1_offset = iu4_ext0_offset + 4;
|
|
parameter iu4_done_offset = iu4_ext1_offset + 4;
|
|
parameter iu4_ov_valid_offset = iu4_done_offset + 1;
|
|
parameter iu4_ov_ifar_offset = iu4_ov_valid_offset + 2;
|
|
parameter iu4_ov_instr0_offset = iu4_ov_ifar_offset + uc_ifar;
|
|
parameter iu4_ov_instr1_offset = iu4_ov_instr0_offset + 32;
|
|
parameter iu4_ov_ext0_offset = iu4_ov_instr1_offset + 32;
|
|
parameter iu4_ov_ext1_offset = iu4_ov_ext0_offset + 4;
|
|
parameter iu4_ov_done_offset = iu4_ov_ext1_offset + 4;
|
|
parameter scan_right = iu4_ov_done_offset + 1 - 1;
|
|
|
|
// Latches
|
|
wire [0:3] iu3_val_d;
|
|
wire [62-`EFF_IFAR_WIDTH:61] iu3_ifar_d;
|
|
wire iu3_2ucode_d;
|
|
wire iu3_2ucode_type_d;
|
|
wire [0:33] iu3_0_instr_d;
|
|
wire [0:33] iu3_1_instr_d;
|
|
wire [0:33] iu3_2_instr_d;
|
|
wire [0:33] iu3_3_instr_d;
|
|
wire [0:3] iu3_val_l2;
|
|
wire [62-`EFF_IFAR_WIDTH:61] iu3_ifar_l2;
|
|
wire iu3_2ucode_l2;
|
|
wire iu3_2ucode_type_l2;
|
|
wire [0:33] iu3_0_instr_l2;
|
|
wire [0:33] iu3_1_instr_l2;
|
|
wire [0:33] iu3_2_instr_l2;
|
|
wire [0:33] iu3_3_instr_l2;
|
|
|
|
wire iu_pc_err_ucode_illegal_d;
|
|
wire iu_pc_err_ucode_illegal_l2;
|
|
wire cp_flush_d;
|
|
wire cp_flush_l2;
|
|
wire br_iu_redirect_d;
|
|
wire br_iu_redirect_l2;
|
|
wire advance_buffers_d;
|
|
wire advance_buffers_l2;
|
|
wire romvalid_d;
|
|
wire romvalid_l2;
|
|
wire iu_flush_d;
|
|
wire iu_flush_l2;
|
|
wire br_hold_d;
|
|
wire br_hold_l2;
|
|
wire flush_into_uc_d;
|
|
wire flush_into_uc_l2;
|
|
wire np1_flush_d;
|
|
wire np1_flush_l2;
|
|
wire [43:61] flush_ifar_d;
|
|
wire [43:61] flush_ifar_l2;
|
|
|
|
reg [0:1] iu4_valid_d;
|
|
wire [62-uc_ifar:61] iu4_ifar_d;
|
|
wire [0:3] iu4_ext0_d; //RT, S1, S2, S3
|
|
wire [0:3] iu4_ext1_d;
|
|
wire iu4_done_d;
|
|
wire [0:1] iu4_valid_l2;
|
|
wire [62-uc_ifar:61] iu4_ifar_l2;
|
|
wire [0:31] iu4_instr0_l2;
|
|
wire [0:31] iu4_instr1_l2;
|
|
wire [0:3] iu4_ext0_l2;
|
|
wire [0:3] iu4_ext1_l2;
|
|
wire iu4_done_l2;
|
|
|
|
reg [0:1] iu4_ov_valid_d;
|
|
wire [62-uc_ifar:61] iu4_ov_ifar_d;
|
|
wire [0:31] iu4_ov_instr0_d;
|
|
wire [0:31] iu4_ov_instr1_d;
|
|
wire [0:3] iu4_ov_ext0_d;
|
|
wire [0:3] iu4_ov_ext1_d;
|
|
wire iu4_ov_done_d;
|
|
wire [0:1] iu4_ov_valid_l2;
|
|
wire [62-uc_ifar:61] iu4_ov_ifar_l2;
|
|
wire [0:31] iu4_ov_instr0_l2;
|
|
wire [0:31] iu4_ov_instr1_l2;
|
|
wire [0:3] iu4_ov_ext0_l2;
|
|
wire [0:3] iu4_ov_ext1_l2;
|
|
wire iu4_ov_done_l2;
|
|
|
|
wire uc_val;
|
|
wire uc_end;
|
|
wire cplbuffer_full;
|
|
wire clear_ill_flush_2ucode;
|
|
wire next_valid;
|
|
wire [0:31] next_instr;
|
|
wire iu2_flush;
|
|
wire flush_next;
|
|
wire flush_next_control;
|
|
wire flush_current;
|
|
wire uc_iu4_flush_int;
|
|
|
|
wire uc_default_act;
|
|
wire uc_stall;
|
|
wire new_command;
|
|
wire msr_64bit;
|
|
wire early_end;
|
|
wire new_cond;
|
|
|
|
wire [0:8] rom_ra;
|
|
wire [62-uc_ifar:61] ucode_ifar;
|
|
wire [0:31] ucode_instr_even;
|
|
wire [0:31] ucode_instr_odd;
|
|
wire [0:3] ucode_ext_even;
|
|
wire [0:3] ucode_ext_odd;
|
|
wire [0:1] ucode_valid;
|
|
|
|
wire rom_act;
|
|
wire [0:9] rom_addr_even;
|
|
wire [0:9] rom_addr_odd;
|
|
wire iu4_stall;
|
|
wire data_valid;
|
|
wire [0:ucode_width-1] rom_data_even;
|
|
wire [0:ucode_width-1] rom_data_odd;
|
|
|
|
wire [0:31] rom_data_even_late_d;
|
|
wire [0:31] rom_data_even_late_l2;
|
|
wire [0:31] rom_data_odd_late_d;
|
|
wire [0:31] rom_data_odd_late_l2;
|
|
|
|
wire ra_valid;
|
|
|
|
wire iu4_stage_act;
|
|
wire iu4_ov_stage_act;
|
|
reg [62-uc_ifar:61] iu4_ifar_out;
|
|
|
|
wire pc_iu_func_sl_thold_1;
|
|
wire pc_iu_func_sl_thold_0;
|
|
wire pc_iu_func_sl_thold_0_b;
|
|
wire pc_iu_sg_1;
|
|
wire pc_iu_sg_0;
|
|
wire force_t;
|
|
|
|
wire xu_iu_flush;
|
|
|
|
wire [0:scan_right+4] siv;
|
|
wire [0:scan_right+4] sov;
|
|
|
|
wire tidn;
|
|
wire tiup;
|
|
|
|
assign tidn = 1'b0;
|
|
assign tiup = 1'b1;
|
|
|
|
//---------------------------------------------------------------------
|
|
// latch inputs
|
|
//---------------------------------------------------------------------
|
|
assign iu3_val_d = {4{(~iu2_flush) & (~xu_iu_flush) & (~ic_bp_iu2_error)}} & ic_bp_iu2_val;
|
|
assign iu3_ifar_d = ic_bp_iu2_ifar;
|
|
assign iu3_2ucode_d = ic_bp_iu2_2ucode & ic_bp_iu2_val[0];
|
|
assign iu3_2ucode_type_d = ic_bp_iu2_2ucode_type & ic_bp_iu2_val[0];
|
|
assign iu3_0_instr_d = ic_bp_iu2_0_instr;
|
|
assign iu3_1_instr_d = ic_bp_iu2_1_instr;
|
|
assign iu3_2_instr_d = ic_bp_iu2_2_instr;
|
|
assign iu3_3_instr_d = ic_bp_iu2_3_instr;
|
|
|
|
//---------------------------------------------------------------------
|
|
// buffers
|
|
//---------------------------------------------------------------------
|
|
|
|
iuq_uc_buffer iuq_uc_buffer0(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.nclk(nclk),
|
|
.pc_iu_func_sl_thold_0_b(pc_iu_func_sl_thold_0_b),
|
|
.pc_iu_sg_0(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.d_mode(d_mode),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.scan_in(siv[scan_right + 4]),
|
|
.scan_out(sov[scan_right + 4]),
|
|
.iu3_val_l2(iu3_val_l2),
|
|
.iu3_ifar_l2(iu3_ifar_l2),
|
|
.iu3_2ucode_l2(iu3_2ucode_l2),
|
|
.iu3_0_instr_l2(iu3_0_instr_l2),
|
|
.iu3_1_instr_l2(iu3_1_instr_l2),
|
|
.iu3_2_instr_l2(iu3_2_instr_l2),
|
|
.iu3_3_instr_l2(iu3_3_instr_l2),
|
|
.ic_bp_iu2_flush(ic_bp_iu2_flush),
|
|
.ic_bp_iu3_flush(ic_bp_iu3_flush),
|
|
.ic_bp_iu3_ecc_err(ic_bp_iu3_ecc_err),
|
|
.bp_ib_iu3_val(bp_ib_iu3_val),
|
|
.uc_ib_iu3_invalid(uc_ib_iu3_invalid),
|
|
.uc_ib_iu3_flush_all(uc_ib_iu3_flush_all),
|
|
.uc_ic_hold(uc_ic_hold),
|
|
.uc_iu4_flush(uc_iu4_flush_int),
|
|
.uc_iu4_flush_ifar(uc_iu4_flush_ifar),
|
|
.xu_iu_flush(xu_iu_flush),
|
|
.uc_val(uc_val),
|
|
.advance_buffers(advance_buffers_l2),
|
|
.br_hold_l2(br_hold_l2),
|
|
.cplbuffer_full(cplbuffer_full),
|
|
.clear_ill_flush_2ucode(clear_ill_flush_2ucode),
|
|
.next_valid(next_valid),
|
|
.next_instr(next_instr),
|
|
.iu2_flush(iu2_flush),
|
|
.flush_next(flush_next),
|
|
.flush_current(flush_current)
|
|
);
|
|
|
|
assign uc_iu4_flush = uc_iu4_flush_int;
|
|
|
|
//---------------------------------------------------------------------
|
|
// new command
|
|
//---------------------------------------------------------------------
|
|
assign uc_default_act = flush_into_uc_l2 | next_valid | uc_val | iu4_valid_l2[0] | iu4_ov_valid_l2[0];
|
|
|
|
// stall if same command in buffer0 next cycle
|
|
assign uc_stall = (uc_val & (~uc_end)) |
|
|
br_hold_l2 | cplbuffer_full; // we need this line if we use new_command to increment cplbuffer (br_hold_l2 prevents underwrap, cplbuffer_full prevents overflow)
|
|
|
|
|
|
assign new_command = next_valid & (~uc_stall); // Check that it can receive next command
|
|
|
|
assign advance_buffers_d = new_command & uc_val;
|
|
|
|
assign msr_64bit = tidn; // Unused
|
|
|
|
// output
|
|
assign early_end = (~late_end);
|
|
|
|
// If '1', will skip lines with skip_cond bit set
|
|
assign new_cond = (~iu3_2ucode_type_l2);
|
|
|
|
//---------------------------------------------------------------------
|
|
// look up address
|
|
//---------------------------------------------------------------------
|
|
|
|
/*
|
|
//table_start
|
|
?TABLE get_address LISTING(final) OPTIMIZE PARMS(ON-SET, DC-SET);
|
|
*INPUTS*============================================*OUTPUTS*====================*
|
|
| | |
|
|
| next_instr | start_addr |
|
|
| | next_instr | | |
|
|
| | | iu3_2ucode_l2 | | xer_type |
|
|
| | | | iu3_2ucode_type_l2 | | | late_end | # For update form, etc.
|
|
| | | | | msr_64bit | | | | force_ep |
|
|
| | | | | | | | | | | fxm_type |
|
|
| | | | | | | | | | | | uc_legal|
|
|
| | 22222222233 | | | | | | | | | | |
|
|
| 012345 12345678901 | | | | 0123456789 | | | | | |
|
|
*TYPE*==============================================+============================+
|
|
| PPPPPP PPPPPPPPPPP P P P | SSSSSSSSSS S S S S S |
|
|
*TERMS*=============================================+============================+
|
|
| 101000 ........... . . . | 0000000000 0 0 0 0 1 | lhz # Flushed 2ucode
|
|
| 011111 0100010111. . . . | 0000010000 0 0 0 0 1 | lhzx
|
|
| 011111 0100011111. . . . | 0000010000 0 0 1 0 1 | lhepx
|
|
| 101010 ........... . . . | 0000100000 0 0 0 0 1 | lha
|
|
| 011111 0101010111. . . . | 0000110000 0 0 0 0 1 | lhax
|
|
| 100000 ........... . . . | 0001000000 0 0 0 0 1 | lwz
|
|
| 011111 0000010111. . . . | 0001010000 0 0 0 0 1 | lwzx
|
|
| 011111 0000011111. . . . | 0001010000 0 0 1 0 1 | lwepx
|
|
| 111010 .........10 . . . | 0001100000 0 1 0 0 1 | lwa
|
|
| 011111 0101010101. . . . | 0001110000 0 0 0 0 1 | lwax
|
|
| 111010 .........00 . . . | 0010000000 0 0 0 0 1 | ld
|
|
| 011111 0000010101. . . . | 0010010000 0 0 0 0 1 | ldx
|
|
| 011111 0000011101. . . . | 0010010000 0 0 1 0 1 | ldepx
|
|
|
|
| 101100 ........... . . . | 0100000000 0 0 0 0 1 | sth
|
|
| 011111 0110010111. . . . | 0100010000 0 0 0 0 1 | sthx
|
|
| 011111 0110011111. . . . | 0100010000 0 0 1 0 1 | sthepx
|
|
| 101101 ........... . . . | 0100000000 0 1 0 0 1 | sthu
|
|
| 011111 0110110111. . . . | 0100010000 0 1 0 0 1 | sthux
|
|
| 100100 ........... . . . | 0101000000 0 0 0 0 1 | stw
|
|
| 011111 0010010111. . . . | 0101010000 0 0 0 0 1 | stwx
|
|
| 011111 0010011111. . . . | 0101010000 0 0 1 0 1 | stwepx
|
|
| 100101 ........... . . . | 0101000000 0 1 0 0 1 | stwu
|
|
| 011111 0010110111. . . . | 0101010000 0 1 0 0 1 | stwux
|
|
| 111110 .........00 . . . | 0110000000 0 0 0 0 1 | std
|
|
| 011111 0010010101. . . . | 0110010000 0 0 0 0 1 | stdx
|
|
| 011111 0010011101. . . . | 0110010000 0 0 1 0 1 | stdepx
|
|
| 111110 .........01 . . . | 0110000000 0 1 0 0 1 | stdu
|
|
| 011111 0010110101. . . . | 0110010000 0 1 0 0 1 | stdux
|
|
| 011111 1100010110. . . . | 0000010000 0 0 0 0 1 | lhbrx
|
|
| 011111 1000010110. . . . | 0001010000 0 0 0 0 1 | lwbrx
|
|
| 011111 1000010100. . . . | 0010010000 0 0 0 0 1 | ldbrx
|
|
| 011111 1110010110. . . . | 0100010000 0 0 0 0 1 | sthbrx
|
|
| 011111 1010010110. . . . | 0101010000 0 0 0 0 1 | stwbrx
|
|
| 011111 1010010100. . . . | 0110010000 0 0 0 0 1 | stdbrx
|
|
| | |
|
|
| 011111 1000000000. . . . | 0101100000 0 1 0 0 1 | mcrxr
|
|
| 011111 0000010011. . . . | 0101110000 0 1 0 0 1 | mfcr
|
|
| 011111 0010010000. . . . | 0111110000 0 1 0 1 1 | mtcrf
|
|
| 011111 0010010000. . . . | 0111110000 0 1 0 1 1 | mtocrf # Flushed 2ucode
|
|
| | |
|
|
| 101001 ........... 1 . . | 0000000000 0 1 0 0 1 | lhzu # Flushed 2ucode
|
|
| 011111 0100110111. 1 . . | 0000010000 0 1 0 0 1 | lhzux
|
|
| 101011 ........... 1 . . | 0000100000 0 1 0 0 1 | lhau
|
|
| 011111 0101110111. 1 . . | 0000110000 0 1 0 0 1 | lhaux
|
|
| 100001 ........... 1 . . | 0001000000 0 1 0 0 1 | lwzu
|
|
| 011111 0000110111. 1 . . | 0001010000 0 1 0 0 1 | lwzux
|
|
| 011111 0101110101. 1 . . | 0001110000 0 1 0 0 1 | lwaux
|
|
| 111010 .........01 1 . . | 0010000000 0 1 0 0 1 | ldu
|
|
| 011111 0000110101. 1 . . | 0010010000 0 1 0 0 1 | ldux
|
|
| | |
|
|
| 100011 ........... . . . | 1010100000 0 1 0 0 1 | lbzu # Aligned
|
|
| 011111 0001110111. . . . | 1010101000 0 1 0 0 1 | lbzux
|
|
| 101001 ........... 0 . . | 1010110000 0 1 0 0 1 | lhzu
|
|
| 011111 0100110111. 0 . . | 1010111000 0 1 0 0 1 | lhzux
|
|
| 101011 ........... 0 . . | 1011100000 0 1 0 0 1 | lhau
|
|
| 011111 0101110111. 0 . . | 1011101000 0 1 0 0 1 | lhaux
|
|
| 100001 ........... 0 . . | 1011000000 0 1 0 0 1 | lwzu
|
|
| 011111 0000110111. 0 . . | 1011001000 0 1 0 0 1 | lwzux
|
|
| 011111 0101110101. 0 . . | 1011111000 0 1 0 0 1 | lwaux
|
|
| 111010 .........01 0 . . | 1011010000 0 1 0 0 1 | ldu
|
|
| 011111 0000110101. 0 . . | 1011011000 0 1 0 0 1 | ldux
|
|
| 101110 ........... . . . | 0010100000 0 1 0 0 1 | lmw
|
|
| 011111 1001010101. . . . | 0010110000 0 1 0 0 1 | lswi
|
|
| 011111 1000010101. . . . | 0011010000 1 1 0 0 1 | lswx
|
|
| 101111 ........... . . . | 0110100000 0 1 0 0 1 | stmw
|
|
| 011111 1011010101. . . . | 0110110000 0 1 0 0 1 | stswi
|
|
| 011111 1010010101. . . . | 0111010000 1 1 0 0 1 | stswx
|
|
| | |
|
|
| 110001 ........... 0 . . | 1111000000 0 1 0 0 1 | lfsu # Aligned
|
|
| 011111 1000110111. 0 . . | 1111001000 0 1 0 0 1 | lfsux
|
|
| 110011 ........... 0 . . | 1111010000 0 1 0 0 1 | lfdu
|
|
| 011111 1001110111. 0 . . | 1111011000 0 1 0 0 1 | lfdux
|
|
| | |
|
|
| 011111 1101010111. . . . | 1000110000 0 1 0 0 1 | lfiwax # Flushed 2ucode
|
|
| 011111 1101110111. . . . | 1001110000 0 1 0 0 1 | lfiwzx
|
|
| 110000 ........... . . . | 1001000000 0 0 0 0 1 | lfs
|
|
| 011111 1000010111. . . . | 1001010000 0 0 0 0 1 | lfsx
|
|
| 110001 ........... 1 . . | 1001000000 0 1 0 0 1 | lfsu
|
|
| 011111 1000110111. 1 . . | 1001010000 0 1 0 0 1 | lfsux
|
|
| 110010 ........... . . . | 1010000000 0 0 0 0 1 | lfd
|
|
| 011111 1001010111. . . . | 1010010000 0 0 0 0 1 | lfdx
|
|
| 011111 1001011111. . . . | 1010010000 0 0 1 0 1 | lfdepx
|
|
| 110011 ........... 1 . . | 1010000000 0 1 0 0 1 | lfdu
|
|
| 011111 1001110111. 1 . . | 1010010000 0 1 0 0 1 | lfdux
|
|
| | |
|
|
| 011111 1111010111. . . . | 1100110000 0 1 0 0 1 | stfiwx
|
|
| 110100 ........... . . . | 1101000000 0 0 0 0 1 | stfs
|
|
| 011111 1010010111. . . . | 1101010000 0 0 0 0 1 | stfsx
|
|
| 110101 ........... . . . | 1101000000 0 1 0 0 1 | stfsu
|
|
| 011111 1010110111. . . . | 1101010000 0 1 0 0 1 | stfsux
|
|
| 110110 ........... . . . | 1110000000 0 0 0 0 1 | stfd
|
|
| 011111 1011010111. . . . | 1110010000 0 0 0 0 1 | stfdx
|
|
| 011111 1011011111. . . . | 1110010000 0 0 1 0 1 | stfdepx
|
|
| 110111 ........... . . . | 1110000000 0 1 0 0 1 | stfdu
|
|
| 011111 1011110111. . . . | 1110010000 0 1 0 0 1 | stfdux
|
|
| | |
|
|
| 000100 .....10101. . . . | 1100000000 0 1 0 0 1 | qvfadd
|
|
| 000000 .....10101. . . . | 1100000000 0 1 0 0 1 | qvfadds
|
|
| 000100 .....10100. . . . | 1100000000 0 1 0 0 1 | qvfsub
|
|
| 000000 .....10100. . . . | 1100000000 0 1 0 0 1 | qvfsubs
|
|
| 000100 .....11000. . . . | 1100000000 0 1 0 0 1 | qvfre
|
|
| 000000 .....11000. . . . | 1100000000 0 1 0 0 1 | qvfres
|
|
| 000100 .....11010. . . . | 1100000000 0 1 0 0 1 | frsqrte
|
|
| 000000 .....11010. . . . | 1100000000 0 1 0 0 1 | frsqrtes
|
|
| 000100 .....11101. . . . | 1100000000 0 1 0 0 1 | qvfmadd
|
|
| 000000 .....11101. . . . | 1100000000 0 1 0 0 1 | qvfmadds
|
|
| 000100 .....11100. . . . | 1100000000 0 1 0 0 1 | qvfmsub
|
|
| 000000 .....11100. . . . | 1100000000 0 1 0 0 1 | qvfmsubs
|
|
| 000100 .....11111. . . . | 1100000000 0 1 0 0 1 | qvfnmadd
|
|
| 000000 .....11111. . . . | 1100000000 0 1 0 0 1 | qvfnmadds
|
|
| 000100 .....11110. . . . | 1100000000 0 1 0 0 1 | qvfnmsub
|
|
| 000000 .....11110. . . . | 1100000000 0 1 0 0 1 | qvfnmsubs
|
|
| 000100 .....01001. . . . | 1100000000 0 1 0 0 1 | qvfxmadd
|
|
| 000000 .....01001. . . . | 1100000000 0 1 0 0 1 | qvfxmadds
|
|
| 000100 .....01011. . . . | 1100000000 0 1 0 0 1 | qvfxxnpmadd
|
|
| 000000 .....01011. . . . | 1100000000 0 1 0 0 1 | qvfxxnpmadds
|
|
| 000100 .....00011. . . . | 1100000000 0 1 0 0 1 | qvfxxcpnmadd
|
|
| 000000 .....00011. . . . | 1100000000 0 1 0 0 1 | qvfxxcpnmadds
|
|
| 000100 .....00001. . . . | 1100000000 0 1 0 0 1 | qvfxxmadd
|
|
| 000000 .....00001. . . . | 1100000000 0 1 0 0 1 | qvfxxmadds
|
|
| 000100 1101001110. . . . | 1100010000 0 1 0 0 1 | qvfcfid - SP prenorm only
|
|
| | |
|
|
| 111111 .....10101. . . . | 1100000000 0 1 0 0 1 | fadd
|
|
| 111011 .....10101. . . . | 1100000000 0 1 0 0 1 | fadds
|
|
| 111111 0000100000. . . . | 1100000000 0 1 0 0 1 | fcmpo
|
|
| 111111 0000000000. . . . | 1100000000 0 1 0 0 1 | fcmpu
|
|
| 111111 .....10010. . . . | 1100001000 0 1 0 0 1 | fdiv
|
|
| 111011 .....10010. . . . | 1100001000 0 1 0 0 1 | fdivs
|
|
| 111111 .....11101. . . . | 1100000000 0 1 0 0 1 | fmadd
|
|
| 111011 .....11101. . . . | 1100000000 0 1 0 0 1 | fmadds
|
|
| 111111 .....11100. . . . | 1100000000 0 1 0 0 1 | fmsub
|
|
| 111011 .....11100. . . . | 1100000000 0 1 0 0 1 | fmsubs
|
|
| 111111 .....11111. . . . | 1100000000 0 1 0 0 1 | fnmadd
|
|
| 111011 .....11111. . . . | 1100000000 0 1 0 0 1 | fnmadds
|
|
| 111111 .....11110. . . . | 1100000000 0 1 0 0 1 | fnmsub
|
|
| 111011 .....11110. . . . | 1100000000 0 1 0 0 1 | fnmsubs
|
|
| 111111 .....11000. . . . | 1100000000 0 1 0 0 1 | fre
|
|
| 111011 .....11000. . . . | 1100000000 0 1 0 0 1 | fres
|
|
| 111111 1101001110. . . . | 1100000000 0 1 0 0 1 | fcfid
|
|
| 111111 1111001110. . . . | 1100000000 0 1 0 0 1 | fcfidu
|
|
| 111011 1101001110. . . . | 1100000000 0 1 0 0 1 | fcfids
|
|
| 111011 1111001110. . . . | 1100000000 0 1 0 0 1 | fcfidus
|
|
| 111111 .....11010. . . . | 1100000000 0 1 0 0 1 | frsqrte
|
|
| 111011 .....11010. . . . | 1100000000 0 1 0 0 1 | frsqrtes
|
|
| 111111 .....10100. . . . | 1100000000 0 1 0 0 1 | fsub
|
|
| 111011 .....10100. . . . | 1100000000 0 1 0 0 1 | fsubs
|
|
| 111111 .....10110. . . . | 1100000000 0 1 0 0 1 | fsqrt
|
|
| 111011 .....10110. . . . | 1100000000 0 1 0 0 1 | fsqrts
|
|
| 111111 0010000000. . . . | 1100001000 0 1 0 0 1 | ftdiv
|
|
| 111111 0010100000. . . . | 1100000000 0 1 0 0 1 | ftsqrt
|
|
| 111111 1011000111. . . . | 1100000000 0 1 0 0 1 | mtfsf
|
|
*END*===============================================+============================+
|
|
?TABLE END get_address ;
|
|
//table_end
|
|
*/
|
|
|
|
//assign_start
|
|
|
|
assign get_address_pt[1] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 16'b0001001101001110);
|
|
assign get_address_pt[2] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 16'b1111110010000000);
|
|
assign get_address_pt[3] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 16'b0111111000000000);
|
|
assign get_address_pt[4] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111101011111);
|
|
assign get_address_pt[5] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[30] , iu3_2ucode_l2
|
|
}) === 16'b0111110000110110);
|
|
assign get_address_pt[6] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] , iu3_2ucode_l2
|
|
}) === 16'b0111111001101110);
|
|
assign get_address_pt[7] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[30] , iu3_2ucode_l2
|
|
}) === 16'b0111110101110111);
|
|
assign get_address_pt[8] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111010110101);
|
|
assign get_address_pt[9] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30] ,
|
|
iu3_2ucode_l2 }) === 17'b01111101001101110);
|
|
assign get_address_pt[10] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111101101111);
|
|
assign get_address_pt[11] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[23] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111111010111);
|
|
assign get_address_pt[12] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b01111100011111);
|
|
assign get_address_pt[13] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[3] , next_instr[4] ,
|
|
next_instr[5] , next_instr[21] ,
|
|
next_instr[22] , next_instr[23] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b111111011000111);
|
|
assign get_address_pt[14] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[30]
|
|
}) === 14'b01111100001111);
|
|
assign get_address_pt[15] =
|
|
(({ next_instr[1] , next_instr[2] ,
|
|
next_instr[3] , next_instr[4] ,
|
|
next_instr[5] , next_instr[21] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b11111110010110);
|
|
assign get_address_pt[16] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[30] , iu3_2ucode_l2
|
|
}) === 16'b0111110101110110);
|
|
assign get_address_pt[17] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[30] }) === 15'b011111010101011);
|
|
assign get_address_pt[18] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111100010101);
|
|
assign get_address_pt[19] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 16'b0111110010010000);
|
|
assign get_address_pt[20] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 16'b0111111101110111);
|
|
assign get_address_pt[21] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 16'b0111110001110111);
|
|
assign get_address_pt[22] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111101110111);
|
|
assign get_address_pt[23] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[22] , next_instr[24] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] , iu3_2ucode_l2
|
|
}) === 14'b01111100101111);
|
|
assign get_address_pt[24] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28]
|
|
}) === 14'b01111110100101);
|
|
assign get_address_pt[25] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[23] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b01111101001111);
|
|
assign get_address_pt[26] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30] ,
|
|
iu3_2ucode_l2 }) === 15'b011111001101111);
|
|
assign get_address_pt[27] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[28] , next_instr[30]
|
|
}) === 14'b01111100100111);
|
|
assign get_address_pt[28] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b01111100001111);
|
|
assign get_address_pt[29] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 16'b0111110000010011);
|
|
assign get_address_pt[30] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[24] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[30]
|
|
}) === 14'b01111100101011);
|
|
assign get_address_pt[31] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[30]
|
|
}) === 14'b01111110101011);
|
|
assign get_address_pt[32] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[3] , next_instr[4] ,
|
|
next_instr[5] , next_instr[21] ,
|
|
next_instr[22] , next_instr[24] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 13'b1111100000000);
|
|
assign get_address_pt[33] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29]
|
|
}) === 14'b01111110001011);
|
|
assign get_address_pt[34] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111000110101);
|
|
assign get_address_pt[35] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b01111110010110);
|
|
assign get_address_pt[36] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[23] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b01111110110111);
|
|
assign get_address_pt[37] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[23] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111010110111);
|
|
assign get_address_pt[38] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[21] ,
|
|
next_instr[22] , next_instr[24] ,
|
|
next_instr[25] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 13'b1111111101110);
|
|
assign get_address_pt[39] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29]
|
|
}) === 14'b01111110001010);
|
|
assign get_address_pt[40] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111101010101);
|
|
assign get_address_pt[41] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b01111100001101);
|
|
assign get_address_pt[42] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 15'b011111111010111);
|
|
assign get_address_pt[43] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[22] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b01111100110111);
|
|
assign get_address_pt[44] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[24] , next_instr[25] ,
|
|
next_instr[26] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 14'b01111110101111);
|
|
assign get_address_pt[45] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[24] ,
|
|
next_instr[25] , next_instr[26] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 13'b0111110001111);
|
|
assign get_address_pt[46] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[30] , next_instr[31] ,
|
|
iu3_2ucode_l2 }) === 9'b111010010);
|
|
assign get_address_pt[47] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[21] , next_instr[22] ,
|
|
next_instr[26] , next_instr[27] ,
|
|
next_instr[28] , next_instr[29] ,
|
|
next_instr[30] }) === 13'b0111111010111);
|
|
assign get_address_pt[48] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[28] , next_instr[30]
|
|
}) === 8'b00000001);
|
|
assign get_address_pt[49] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[27] , next_instr[30]
|
|
}) === 8'b00000110);
|
|
assign get_address_pt[50] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28]
|
|
}) === 8'b00000111);
|
|
assign get_address_pt[51] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[28] , next_instr[29]
|
|
}) === 8'b00000110);
|
|
assign get_address_pt[52] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
iu3_2ucode_l2 }) === 7'b1100110);
|
|
assign get_address_pt[53] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[30] ,
|
|
next_instr[31] }) === 7'b1111001);
|
|
assign get_address_pt[54] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
iu3_2ucode_l2 }) === 7'b1010010);
|
|
assign get_address_pt[55] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[30] , next_instr[31]
|
|
}) === 8'b11101010);
|
|
assign get_address_pt[56] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
iu3_2ucode_l2 }) === 7'b1010110);
|
|
assign get_address_pt[57] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28] ,
|
|
next_instr[29] , next_instr[30]
|
|
}) === 10'b1111110010);
|
|
assign get_address_pt[58] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[5] , iu3_2ucode_l2
|
|
}) === 6'b110010);
|
|
assign get_address_pt[59] =
|
|
(({ next_instr[0] , next_instr[2] ,
|
|
next_instr[3] , next_instr[5] ,
|
|
iu3_2ucode_l2 }) === 5'b10010);
|
|
assign get_address_pt[60] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[3] , next_instr[4] ,
|
|
next_instr[5] , next_instr[30]
|
|
}) === 6'b111100);
|
|
assign get_address_pt[61] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] , next_instr[5]
|
|
}) === 6'b100011);
|
|
assign get_address_pt[62] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[3] , next_instr[4]
|
|
}) === 4'b1010);
|
|
assign get_address_pt[63] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[3] , next_instr[5]
|
|
}) === 4'b1001);
|
|
assign get_address_pt[64] =
|
|
(({ next_instr[0] , next_instr[2] ,
|
|
next_instr[4] , next_instr[5]
|
|
}) === 4'b1001);
|
|
assign get_address_pt[65] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[4] , next_instr[5] ,
|
|
next_instr[30] }) === 5'b11100);
|
|
assign get_address_pt[66] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[27] , next_instr[30]
|
|
}) === 8'b11111110);
|
|
assign get_address_pt[67] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4]
|
|
}) === 4'b1011);
|
|
assign get_address_pt[68] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3]
|
|
}) === 4'b1101);
|
|
assign get_address_pt[69] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[4] }) === 5'b10111);
|
|
assign get_address_pt[70] =
|
|
(({ next_instr[0] , next_instr[2] ,
|
|
next_instr[4] }) === 3'b100);
|
|
assign get_address_pt[71] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[27] , next_instr[28]
|
|
}) === 8'b11111111);
|
|
assign get_address_pt[72] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[28] , next_instr[29]
|
|
}) === 8'b11111110);
|
|
assign get_address_pt[73] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[3] ,
|
|
next_instr[5] }) === 5'b10111);
|
|
assign get_address_pt[74] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[5]
|
|
}) === 4'b1101);
|
|
assign get_address_pt[75] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4] ,
|
|
next_instr[5] , next_instr[26] ,
|
|
next_instr[28] , next_instr[30]
|
|
}) === 8'b11111110);
|
|
assign get_address_pt[76] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] }) === 3'b110);
|
|
assign get_address_pt[77] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] }) === 3'b101);
|
|
assign get_address_pt[78] =
|
|
(({ next_instr[0] , next_instr[1] ,
|
|
next_instr[2] , next_instr[4]
|
|
}) === 4'b1101);
|
|
assign start_addr[0] =
|
|
(get_address_pt[1] | get_address_pt[5]
|
|
| get_address_pt[9] | get_address_pt[13]
|
|
| get_address_pt[16] | get_address_pt[20]
|
|
| get_address_pt[21] | get_address_pt[32]
|
|
| get_address_pt[38] | get_address_pt[42]
|
|
| get_address_pt[44] | get_address_pt[46]
|
|
| get_address_pt[47] | get_address_pt[48]
|
|
| get_address_pt[49] | get_address_pt[50]
|
|
| get_address_pt[51] | get_address_pt[54]
|
|
| get_address_pt[56] | get_address_pt[57]
|
|
| get_address_pt[59] | get_address_pt[61]
|
|
| get_address_pt[66] | get_address_pt[71]
|
|
| get_address_pt[72] | get_address_pt[75]
|
|
| get_address_pt[76]);
|
|
assign start_addr[1] =
|
|
(get_address_pt[1] | get_address_pt[3]
|
|
| get_address_pt[6] | get_address_pt[10]
|
|
| get_address_pt[11] | get_address_pt[13]
|
|
| get_address_pt[15] | get_address_pt[19]
|
|
| get_address_pt[24] | get_address_pt[25]
|
|
| get_address_pt[27] | get_address_pt[29]
|
|
| get_address_pt[30] | get_address_pt[31]
|
|
| get_address_pt[32] | get_address_pt[36]
|
|
| get_address_pt[37] | get_address_pt[38]
|
|
| get_address_pt[48] | get_address_pt[49]
|
|
| get_address_pt[50] | get_address_pt[51]
|
|
| get_address_pt[57] | get_address_pt[58]
|
|
| get_address_pt[60] | get_address_pt[62]
|
|
| get_address_pt[66] | get_address_pt[68]
|
|
| get_address_pt[71] | get_address_pt[72]
|
|
| get_address_pt[73] | get_address_pt[75]
|
|
);
|
|
assign start_addr[2] =
|
|
(get_address_pt[5] | get_address_pt[6]
|
|
| get_address_pt[9] | get_address_pt[16]
|
|
| get_address_pt[19] | get_address_pt[21]
|
|
| get_address_pt[22] | get_address_pt[34]
|
|
| get_address_pt[39] | get_address_pt[40]
|
|
| get_address_pt[41] | get_address_pt[44]
|
|
| get_address_pt[54] | get_address_pt[56]
|
|
| get_address_pt[59] | get_address_pt[61]
|
|
| get_address_pt[65] | get_address_pt[69]
|
|
| get_address_pt[78]);
|
|
assign start_addr[3] =
|
|
(get_address_pt[3] | get_address_pt[5]
|
|
| get_address_pt[6] | get_address_pt[8]
|
|
| get_address_pt[16] | get_address_pt[18]
|
|
| get_address_pt[19] | get_address_pt[20]
|
|
| get_address_pt[28] | get_address_pt[29]
|
|
| get_address_pt[33] | get_address_pt[43]
|
|
| get_address_pt[46] | get_address_pt[55]
|
|
| get_address_pt[56] | get_address_pt[58]
|
|
| get_address_pt[70]);
|
|
assign start_addr[4] =
|
|
(get_address_pt[3] | get_address_pt[7]
|
|
| get_address_pt[9] | get_address_pt[16]
|
|
| get_address_pt[17] | get_address_pt[19]
|
|
| get_address_pt[20] | get_address_pt[21]
|
|
| get_address_pt[29] | get_address_pt[40]
|
|
| get_address_pt[42] | get_address_pt[54]
|
|
| get_address_pt[55] | get_address_pt[61]
|
|
| get_address_pt[67]);
|
|
assign start_addr[5] =
|
|
(get_address_pt[1] | get_address_pt[7]
|
|
| get_address_pt[8] | get_address_pt[9]
|
|
| get_address_pt[17] | get_address_pt[19]
|
|
| get_address_pt[20] | get_address_pt[22]
|
|
| get_address_pt[23] | get_address_pt[26]
|
|
| get_address_pt[29] | get_address_pt[33]
|
|
| get_address_pt[34] | get_address_pt[35]
|
|
| get_address_pt[36] | get_address_pt[37]
|
|
| get_address_pt[39] | get_address_pt[40]
|
|
| get_address_pt[41] | get_address_pt[42]
|
|
| get_address_pt[44] | get_address_pt[45]
|
|
| get_address_pt[46] | get_address_pt[52]
|
|
| get_address_pt[54]);
|
|
assign start_addr[6] =
|
|
(get_address_pt[2] | get_address_pt[5]
|
|
| get_address_pt[6] | get_address_pt[9]
|
|
| get_address_pt[16] | get_address_pt[21]
|
|
| get_address_pt[57]);
|
|
assign start_addr[7] =
|
|
1'b0;
|
|
assign start_addr[8] =
|
|
1'b0;
|
|
assign start_addr[9] =
|
|
1'b0;
|
|
assign xer_type =
|
|
(get_address_pt[18]);
|
|
assign late_end =
|
|
(get_address_pt[1] | get_address_pt[3]
|
|
| get_address_pt[7] | get_address_pt[9]
|
|
| get_address_pt[13] | get_address_pt[16]
|
|
| get_address_pt[18] | get_address_pt[19]
|
|
| get_address_pt[20] | get_address_pt[21]
|
|
| get_address_pt[22] | get_address_pt[26]
|
|
| get_address_pt[29] | get_address_pt[32]
|
|
| get_address_pt[34] | get_address_pt[37]
|
|
| get_address_pt[38] | get_address_pt[40]
|
|
| get_address_pt[42] | get_address_pt[43]
|
|
| get_address_pt[48] | get_address_pt[49]
|
|
| get_address_pt[50] | get_address_pt[51]
|
|
| get_address_pt[53] | get_address_pt[55]
|
|
| get_address_pt[57] | get_address_pt[63]
|
|
| get_address_pt[64] | get_address_pt[66]
|
|
| get_address_pt[69] | get_address_pt[71]
|
|
| get_address_pt[72] | get_address_pt[73]
|
|
| get_address_pt[74] | get_address_pt[75]
|
|
);
|
|
assign force_ep =
|
|
(get_address_pt[4] | get_address_pt[12]
|
|
| get_address_pt[14]);
|
|
assign fxm_type =
|
|
(get_address_pt[19]);
|
|
assign uc_legal =
|
|
(get_address_pt[1] | get_address_pt[3]
|
|
| get_address_pt[7] | get_address_pt[9]
|
|
| get_address_pt[13] | get_address_pt[16]
|
|
| get_address_pt[17] | get_address_pt[19]
|
|
| get_address_pt[20] | get_address_pt[21]
|
|
| get_address_pt[26] | get_address_pt[29]
|
|
| get_address_pt[32] | get_address_pt[34]
|
|
| get_address_pt[35] | get_address_pt[37]
|
|
| get_address_pt[38] | get_address_pt[39]
|
|
| get_address_pt[40] | get_address_pt[41]
|
|
| get_address_pt[42] | get_address_pt[43]
|
|
| get_address_pt[44] | get_address_pt[45]
|
|
| get_address_pt[47] | get_address_pt[48]
|
|
| get_address_pt[49] | get_address_pt[50]
|
|
| get_address_pt[51] | get_address_pt[55]
|
|
| get_address_pt[57] | get_address_pt[61]
|
|
| get_address_pt[65] | get_address_pt[66]
|
|
| get_address_pt[70] | get_address_pt[71]
|
|
| get_address_pt[72] | get_address_pt[75]
|
|
| get_address_pt[77] | get_address_pt[78]
|
|
);
|
|
|
|
//assign_end
|
|
|
|
//---------------------------------------------------------------------
|
|
// illegal op
|
|
//---------------------------------------------------------------------
|
|
|
|
// Need to handle the cmodx case where load/store gets flushed to uCode,
|
|
// then that instruction is changed to some non-uCode instruction.
|
|
// Solution: Any time an instruction was flushed_2ucode and doesn't hit
|
|
// in table, flush instruction to clear flush_2ucode bit. Instruction
|
|
// will then re-fetch as regular instruction.
|
|
assign clear_ill_flush_2ucode = new_command & (~uc_legal) & iu3_2ucode_l2;
|
|
|
|
assign flush_next_control = flush_next | clear_ill_flush_2ucode;
|
|
|
|
assign iu_pc_err_ucode_illegal_d = new_command & (~uc_legal) & (~iu3_2ucode_l2) & (~flush_next);
|
|
|
|
tri_direct_err_rpt #(.WIDTH(1)) err_ucode_illegal(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.err_in(iu_pc_err_ucode_illegal_l2),
|
|
.err_out(iu_pc_err_ucode_illegal)
|
|
);
|
|
|
|
//---------------------------------------------------------------------
|
|
// create instruction
|
|
//---------------------------------------------------------------------
|
|
assign xu_iu_flush = iu_flush_l2 | br_iu_redirect_l2;
|
|
assign iu_flush_d = iu_flush;
|
|
assign cp_flush_d = cp_flush;
|
|
assign br_iu_redirect_d = br_iu_redirect & (~(cp_flush_l2 | iu_flush_l2));
|
|
|
|
// When br_iu_redirect happens, hold off uCode commands until cp_flush
|
|
// otherwise weird things happen
|
|
assign br_hold_d = (cp_flush_l2 == 1'b1) ? 1'b0 :
|
|
(br_iu_redirect_l2 == 1'b1) ? 1'b1 :
|
|
br_hold_l2;
|
|
|
|
assign flush_into_uc_d = iu_flush & cp_flush_into_uc;
|
|
assign np1_flush_d = cp_uc_np1_flush;
|
|
assign flush_ifar_d = cp_uc_flush_ifar;
|
|
|
|
iuq_uc_control uc_control(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.nclk(nclk),
|
|
.pc_iu_func_sl_thold_0_b(pc_iu_func_sl_thold_0_b),
|
|
.pc_iu_sg_0(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.d_mode(d_mode),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.scan_in(siv[scan_right + 1]),
|
|
.scan_out(sov[scan_right + 1]),
|
|
.xu_iu_ucode_xer_val(xu_iu_ucode_xer_val),
|
|
.xu_iu_ucode_xer(xu_iu_ucode_xer),
|
|
.br_hold(br_hold_l2),
|
|
.flush_next(flush_next_control),
|
|
.flush(flush_current),
|
|
.flush_into_uc(flush_into_uc_l2),
|
|
.np1_flush(np1_flush_l2),
|
|
.flush_ifar(flush_ifar_l2),
|
|
.cp_uc_credit_free(cp_uc_credit_free),
|
|
.cp_flush(cp_flush_l2),
|
|
.uc_default_act(uc_default_act),
|
|
.next_valid(next_valid),
|
|
.new_command(new_command),
|
|
.new_instr(next_instr),
|
|
.start_addr(start_addr[0:8]), // bit (9) is unused - always even
|
|
.xer_type(xer_type),
|
|
.early_end(early_end),
|
|
.force_ep(force_ep),
|
|
.fxm_type(fxm_type),
|
|
.new_cond(new_cond),
|
|
.ra_valid(ra_valid),
|
|
.rom_ra(rom_ra),
|
|
.rom_act(rom_act),
|
|
.data_valid(data_valid),
|
|
.rom_data_even(rom_data_even[32:ucode_width - 1]),
|
|
.rom_data_odd(rom_data_odd[32:ucode_width - 1]),
|
|
.rom_data_even_late(rom_data_even_late_l2),
|
|
.rom_data_odd_late(rom_data_odd_late_l2),
|
|
.uc_val(uc_val),
|
|
.uc_end(uc_end),
|
|
.cplbuffer_full(cplbuffer_full),
|
|
.ucode_valid(ucode_valid),
|
|
.ucode_ifar_even(ucode_ifar),
|
|
.ucode_instr_even(ucode_instr_even),
|
|
.ucode_instr_odd(ucode_instr_odd),
|
|
.ucode_ext_even(ucode_ext_even),
|
|
.ucode_ext_odd(ucode_ext_odd)
|
|
);
|
|
|
|
//---------------------------------------------------------------------
|
|
// ROM
|
|
//---------------------------------------------------------------------
|
|
|
|
assign romvalid_d = ra_valid;
|
|
|
|
assign rom_addr_even = {rom_ra[0:8], 1'b0};
|
|
assign rom_addr_odd = {rom_ra[0:8], 1'b1};
|
|
|
|
assign iu4_stall = iu4_valid_l2[0] & iu4_ov_valid_l2[0]; // ??? Need to check vector if ever switch to only i1 being valid
|
|
|
|
assign data_valid = romvalid_l2 & (~iu4_stall);
|
|
|
|
//---------------------------------------------------------------------
|
|
// ROM Lookup
|
|
//---------------------------------------------------------------------
|
|
|
|
iuq_uc_rom_even uc_rom_even(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.nclk(nclk),
|
|
.pc_iu_func_sl_thold_0_b(pc_iu_func_sl_thold_0_b),
|
|
.pc_iu_sg_0(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.d_mode(d_mode),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.scan_in(siv[scan_right + 2]),
|
|
.scan_out(sov[scan_right + 2]),
|
|
.rom_act(rom_act),
|
|
.rom_addr(rom_addr_even),
|
|
.rom_data(rom_data_even)
|
|
);
|
|
assign rom_data_even_late_d = rom_data_even[0:31];
|
|
|
|
iuq_uc_rom_odd uc_rom_odd(
|
|
.vdd(vdd),
|
|
.gnd(gnd),
|
|
.nclk(nclk),
|
|
.pc_iu_func_sl_thold_0_b(pc_iu_func_sl_thold_0_b),
|
|
.pc_iu_sg_0(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.d_mode(d_mode),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.scan_in(siv[scan_right + 3]),
|
|
.scan_out(sov[scan_right + 3]),
|
|
.rom_act(rom_act),
|
|
.rom_addr(rom_addr_odd),
|
|
.rom_data(rom_data_odd)
|
|
);
|
|
assign rom_data_odd_late_d = rom_data_odd[0:31];
|
|
|
|
//---------------------------------------------------------------------
|
|
// Staging latches
|
|
//---------------------------------------------------------------------
|
|
assign iu4_stage_act = data_valid; // ??? Removed "not flush and not skip" from act. Do we want to add in some form of skip check?
|
|
|
|
generate
|
|
begin : xhdl1
|
|
genvar i;
|
|
for (i = 0; i <= 1; i = i + 1)
|
|
begin : gen_iu4_val
|
|
always @(*) iu4_valid_d[i] = ((ucode_valid[i] & (~iu4_stall)) |
|
|
(iu4_valid_l2[i] & iu4_stall)) &
|
|
(~(iu_flush_l2 | br_iu_redirect_l2)); // clear on flush
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign iu4_ifar_d = ucode_ifar;
|
|
assign iu4_ext0_d = ucode_ext_even;
|
|
assign iu4_ext1_d = ucode_ext_odd;
|
|
|
|
//late data
|
|
assign iu4_instr0_l2 = ucode_instr_even;
|
|
assign iu4_instr1_l2 = ucode_instr_odd;
|
|
|
|
assign iu4_done_d = uc_end;
|
|
|
|
// Overflow latches
|
|
assign iu4_ov_stage_act = iu4_valid_l2[0] & (~iu4_ov_valid_l2[0]);
|
|
generate
|
|
begin : xhdl2
|
|
genvar i;
|
|
for (i = 0; i <= 1; i = i + 1)
|
|
begin : gen_ov_valid
|
|
always @(*) iu4_ov_valid_d[i] = (iu4_ov_valid_l2[i] | (iu4_valid_l2[i] & (~iu4_ov_valid_l2[0]))) & (~ib_uc_rdy) & (~(iu_flush_l2 | br_iu_redirect_l2));
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
assign iu4_ov_ifar_d = iu4_ifar_l2;
|
|
assign iu4_ov_ext0_d = iu4_ext0_l2;
|
|
assign iu4_ov_ext1_d = iu4_ext1_l2;
|
|
assign iu4_ov_instr0_d = iu4_instr0_l2;
|
|
assign iu4_ov_instr1_d = iu4_instr1_l2;
|
|
assign iu4_ov_done_d = iu4_done_l2;
|
|
|
|
// If uc_ifar > `EFF_IFAR_WIDTH, we
|
|
// need to change uc_control so uc_ifar is not bigger than EFF_IFAR_WIDTH
|
|
// so that we don't lose part of ifar on flush
|
|
|
|
generate
|
|
begin
|
|
if (uc_ifar >= `EFF_IFAR_WIDTH)
|
|
begin : ifara
|
|
always @(*) uc_ib_ifar0 = iu4_ifar_out[62 - `EFF_IFAR_WIDTH:61];
|
|
always @(*) uc_ib_ifar1 = {iu4_ifar_out[62 - `EFF_IFAR_WIDTH:60], 1'b1};
|
|
end
|
|
if (uc_ifar < `EFF_IFAR_WIDTH)
|
|
begin : ifarb
|
|
always @(*)
|
|
begin
|
|
uc_ib_ifar0[62 - `EFF_IFAR_WIDTH:62 - uc_ifar - 1] = {`EFF_IFAR_WIDTH-uc_ifar{1'b0}};
|
|
uc_ib_ifar1[62 - `EFF_IFAR_WIDTH:62 - uc_ifar - 1] = {`EFF_IFAR_WIDTH-uc_ifar{1'b0}};
|
|
|
|
uc_ib_ifar0[62 - uc_ifar:61] = iu4_ifar_out;
|
|
uc_ib_ifar1[62 - uc_ifar:61] = {iu4_ifar_out[62 - uc_ifar:60], 1'b1};
|
|
end
|
|
end
|
|
end
|
|
endgenerate
|
|
|
|
always @*
|
|
begin: ib_proc
|
|
uc_ib_val = iu4_valid_l2;
|
|
iu4_ifar_out = iu4_ifar_l2;
|
|
uc_ib_instr0 = iu4_instr0_l2;
|
|
uc_ib_instr1 = iu4_instr1_l2;
|
|
uc_ib_ext0 = iu4_ext0_l2;
|
|
uc_ib_ext1 = iu4_ext1_l2;
|
|
uc_ib_done = iu4_done_l2;
|
|
|
|
if (iu4_ov_valid_l2[0] == 1'b1)
|
|
begin
|
|
uc_ib_val = iu4_ov_valid_l2;
|
|
iu4_ifar_out = iu4_ov_ifar_l2;
|
|
uc_ib_instr0 = iu4_ov_instr0_l2;
|
|
uc_ib_instr1 = iu4_ov_instr1_l2;
|
|
uc_ib_ext0 = iu4_ov_ext0_l2;
|
|
uc_ib_ext1 = iu4_ov_ext1_l2;
|
|
uc_ib_done = iu4_ov_done_l2;
|
|
end
|
|
end
|
|
|
|
//---------------------------------------------------------------------
|
|
// Latches
|
|
//---------------------------------------------------------------------
|
|
|
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(1)) iu3_val_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu3_val_offset:iu3_val_offset + 4 - 1]),
|
|
.scout(sov[iu3_val_offset:iu3_val_offset + 4 - 1]),
|
|
.din(iu3_val_d),
|
|
.dout(iu3_val_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(`EFF_IFAR_WIDTH), .INIT(0), .NEEDS_SRESET(0)) iu3_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(ic_bp_iu2_val[0]),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu3_ifar_offset:iu3_ifar_offset + `EFF_IFAR_WIDTH - 1]),
|
|
.scout(sov[iu3_ifar_offset:iu3_ifar_offset + `EFF_IFAR_WIDTH - 1]),
|
|
.din(iu3_ifar_d),
|
|
.dout(iu3_ifar_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(0)) iu3_2ucode_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu3_2ucode_offset]),
|
|
.scout(sov[iu3_2ucode_offset]),
|
|
.din(iu3_2ucode_d),
|
|
.dout(iu3_2ucode_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(0)) iu3_2ucode_type_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu3_2ucode_type_offset]),
|
|
.scout(sov[iu3_2ucode_type_offset]),
|
|
.din(iu3_2ucode_type_d),
|
|
.dout(iu3_2ucode_type_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(34 * 4), .INIT(0), .NEEDS_SRESET(0)) iu3_instr_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(ic_bp_iu2_val[0]), // ??? Could create act for 0:31 when buffers full?
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu3_instr_offset:iu3_instr_offset + (34 * 4) - 1]),
|
|
.scout(sov[iu3_instr_offset:iu3_instr_offset + (34 * 4) - 1]),
|
|
.din({iu3_0_instr_d, iu3_1_instr_d, iu3_2_instr_d, iu3_3_instr_d}),
|
|
.dout({iu3_0_instr_l2, iu3_1_instr_l2, iu3_2_instr_l2, iu3_3_instr_l2})
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(0)) iu_pc_err_ucode_illegal_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu_pc_err_ucode_illegal_offset]),
|
|
.scout(sov[iu_pc_err_ucode_illegal_offset]),
|
|
.din(iu_pc_err_ucode_illegal_d),
|
|
.dout(iu_pc_err_ucode_illegal_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(0)) iu_flush_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu_flush_offset]),
|
|
.scout(sov[iu_flush_offset]),
|
|
.din(iu_flush_d),
|
|
.dout(iu_flush_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) br_hold_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[br_hold_offset]),
|
|
.scout(sov[br_hold_offset]),
|
|
.din(br_hold_d),
|
|
.dout(br_hold_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) flush_into_uc_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[flush_into_uc_offset]),
|
|
.scout(sov[flush_into_uc_offset]),
|
|
.din(flush_into_uc_d),
|
|
.dout(flush_into_uc_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) np1_flush_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(cp_flush_into_uc),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[np1_flush_offset]),
|
|
.scout(sov[np1_flush_offset]),
|
|
.din(np1_flush_d),
|
|
.dout(np1_flush_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(19), .INIT(0), .NEEDS_SRESET(0)) flush_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(cp_flush_into_uc),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[flush_ifar_offset:flush_ifar_offset + 19 - 1]),
|
|
.scout(sov[flush_ifar_offset:flush_ifar_offset + 19 - 1]),
|
|
.din(flush_ifar_d),
|
|
.dout(flush_ifar_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) cp_flush_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[cp_flush_offset]),
|
|
.scout(sov[cp_flush_offset]),
|
|
.din(cp_flush_d),
|
|
.dout(cp_flush_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) br_iu_redirect_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[br_iu_redirect_offset]),
|
|
.scout(sov[br_iu_redirect_offset]),
|
|
.din(br_iu_redirect_d),
|
|
.dout(br_iu_redirect_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) advance_buffers_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(tiup),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[advance_buffers_offset]),
|
|
.scout(sov[advance_buffers_offset]),
|
|
.din(advance_buffers_d),
|
|
.dout(advance_buffers_l2)
|
|
);
|
|
|
|
// ROM
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(1)) romvalid_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(uc_default_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[romvalid_offset]),
|
|
.scout(sov[romvalid_offset]),
|
|
.din(romvalid_d),
|
|
.dout(romvalid_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(32), .INIT(0), .NEEDS_SRESET(0)) rom_data_even_late_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[rom_data_even_late_offset:rom_data_even_late_offset + 32 - 1]),
|
|
.scout(sov[rom_data_even_late_offset:rom_data_even_late_offset + 32 - 1]),
|
|
.din(rom_data_even_late_d),
|
|
.dout(rom_data_even_late_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(32), .INIT(0), .NEEDS_SRESET(0)) rom_data_odd_late_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[rom_data_odd_late_offset:rom_data_odd_late_offset + 32 - 1]),
|
|
.scout(sov[rom_data_odd_late_offset:rom_data_odd_late_offset + 32 - 1]),
|
|
.din(rom_data_odd_late_d),
|
|
.dout(rom_data_odd_late_l2)
|
|
);
|
|
|
|
// Staging latches
|
|
tri_rlmreg_p #(.WIDTH(2), .INIT(0), .NEEDS_SRESET(1)) iu4_valid_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(uc_default_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_valid_offset:iu4_valid_offset + 2 - 1]),
|
|
.scout(sov[iu4_valid_offset:iu4_valid_offset + 2 - 1]),
|
|
.din(iu4_valid_d),
|
|
.dout(iu4_valid_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(uc_ifar), .INIT(0), .NEEDS_SRESET(0)) iu4_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ifar_offset:iu4_ifar_offset + uc_ifar - 1]),
|
|
.scout(sov[iu4_ifar_offset:iu4_ifar_offset + uc_ifar - 1]),
|
|
.din(iu4_ifar_d),
|
|
.dout(iu4_ifar_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(0)) iu4_ext0_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ext0_offset:iu4_ext0_offset + 4 - 1]),
|
|
.scout(sov[iu4_ext0_offset:iu4_ext0_offset + 4 - 1]),
|
|
.din(iu4_ext0_d),
|
|
.dout(iu4_ext0_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(0)) iu4_ext1_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ext1_offset:iu4_ext1_offset + 4 - 1]),
|
|
.scout(sov[iu4_ext1_offset:iu4_ext1_offset + 4 - 1]),
|
|
.din(iu4_ext1_d),
|
|
.dout(iu4_ext1_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(0)) iu4_done_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_done_offset]),
|
|
.scout(sov[iu4_done_offset]),
|
|
.din(iu4_done_d),
|
|
.dout(iu4_done_l2)
|
|
);
|
|
|
|
// Overflow Staging latches
|
|
tri_rlmreg_p #(.WIDTH(2), .INIT(0), .NEEDS_SRESET(1)) iu4_ov_valid_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(uc_default_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ov_valid_offset:iu4_ov_valid_offset + 2 - 1]),
|
|
.scout(sov[iu4_ov_valid_offset:iu4_ov_valid_offset + 2 - 1]),
|
|
.din(iu4_ov_valid_d),
|
|
.dout(iu4_ov_valid_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(uc_ifar), .INIT(0), .NEEDS_SRESET(0)) iu4_ov_ifar_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_ov_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ov_ifar_offset:iu4_ov_ifar_offset + uc_ifar - 1]),
|
|
.scout(sov[iu4_ov_ifar_offset:iu4_ov_ifar_offset + uc_ifar - 1]),
|
|
.din(iu4_ov_ifar_d),
|
|
.dout(iu4_ov_ifar_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(32), .INIT(0), .NEEDS_SRESET(0)) iu4_ov_instr0_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_ov_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ov_instr0_offset:iu4_ov_instr0_offset + 32 - 1]),
|
|
.scout(sov[iu4_ov_instr0_offset:iu4_ov_instr0_offset + 32 - 1]),
|
|
.din(iu4_ov_instr0_d),
|
|
.dout(iu4_ov_instr0_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(32), .INIT(0), .NEEDS_SRESET(0)) iu4_ov_instr1_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_ov_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ov_instr1_offset:iu4_ov_instr1_offset + 32 - 1]),
|
|
.scout(sov[iu4_ov_instr1_offset:iu4_ov_instr1_offset + 32 - 1]),
|
|
.din(iu4_ov_instr1_d),
|
|
.dout(iu4_ov_instr1_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(0)) u4_ov_ext0_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_ov_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ov_ext0_offset:iu4_ov_ext0_offset + 4 - 1]),
|
|
.scout(sov[iu4_ov_ext0_offset:iu4_ov_ext0_offset + 4 - 1]),
|
|
.din(iu4_ov_ext0_d),
|
|
.dout(iu4_ov_ext0_l2)
|
|
);
|
|
|
|
tri_rlmreg_p #(.WIDTH(4), .INIT(0), .NEEDS_SRESET(0)) iu4_ov_ext1_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_ov_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ov_ext1_offset:iu4_ov_ext1_offset + 4 - 1]),
|
|
.scout(sov[iu4_ov_ext1_offset:iu4_ov_ext1_offset + 4 - 1]),
|
|
.din(iu4_ov_ext1_d),
|
|
.dout(iu4_ov_ext1_l2)
|
|
);
|
|
|
|
tri_rlmlatch_p #(.INIT(0), .NEEDS_SRESET(0)) iu4_ov_done_latch(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.act(iu4_ov_stage_act),
|
|
.thold_b(pc_iu_func_sl_thold_0_b),
|
|
.sg(pc_iu_sg_0),
|
|
.force_t(force_t),
|
|
.delay_lclkr(delay_lclkr),
|
|
.mpw1_b(mpw1_b),
|
|
.mpw2_b(mpw2_b),
|
|
.d_mode(d_mode),
|
|
.scin(siv[iu4_ov_done_offset]),
|
|
.scout(sov[iu4_ov_done_offset]),
|
|
.din(iu4_ov_done_d),
|
|
.dout(iu4_ov_done_l2)
|
|
);
|
|
|
|
//---------------------------------------------------------------------
|
|
// pervasive thold/sg latches
|
|
//---------------------------------------------------------------------
|
|
|
|
tri_plat #(.WIDTH(2)) perv_2to1_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.flush(tc_ac_ccflush_dc),
|
|
.din({pc_iu_func_sl_thold_2, pc_iu_sg_2}),
|
|
.q( {pc_iu_func_sl_thold_1, pc_iu_sg_1})
|
|
);
|
|
|
|
tri_plat #(.WIDTH(2)) perv_1to0_reg(
|
|
.vd(vdd),
|
|
.gd(gnd),
|
|
.nclk(nclk),
|
|
.flush(tc_ac_ccflush_dc),
|
|
.din({pc_iu_func_sl_thold_1, pc_iu_sg_1}),
|
|
.q( {pc_iu_func_sl_thold_0, pc_iu_sg_0})
|
|
);
|
|
|
|
tri_lcbor perv_lcbor(
|
|
.clkoff_b(clkoff_b),
|
|
.thold(pc_iu_func_sl_thold_0),
|
|
.sg(pc_iu_sg_0),
|
|
.act_dis(act_dis),
|
|
.force_t(force_t),
|
|
.thold_b(pc_iu_func_sl_thold_0_b)
|
|
);
|
|
|
|
//---------------------------------------------------------------------
|
|
// Scan
|
|
//---------------------------------------------------------------------
|
|
assign siv[0:scan_right + 4] = {sov[1:scan_right + 4], scan_in};
|
|
assign scan_out = sov[0];
|
|
|
|
endmodule
|