// ========== Copyright Header Begin ==========================================
|
// ========== Copyright Header Begin ==========================================
|
//
|
//
|
// OpenSPARC T1 Processor File: bw_r_irf_register.v
|
// OpenSPARC T1 Processor File: bw_r_irf_register.v
|
// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
|
// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
|
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
|
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
|
//
|
//
|
// The above named program is free software; you can redistribute it and/or
|
// The above named program is free software; you can redistribute it and/or
|
// modify it under the terms of the GNU General Public
|
// modify it under the terms of the GNU General Public
|
// License version 2 as published by the Free Software Foundation.
|
// License version 2 as published by the Free Software Foundation.
|
//
|
//
|
// The above named program is distributed in the hope that it will be
|
// The above named program is distributed in the hope that it will be
|
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// General Public License for more details.
|
// General Public License for more details.
|
//
|
//
|
// You should have received a copy of the GNU General Public
|
// You should have received a copy of the GNU General Public
|
// License along with this work; if not, write to the Free Software
|
// License along with this work; if not, write to the Free Software
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
//
|
//
|
// ========== Copyright Header End ============================================
|
// ========== Copyright Header End ============================================
|
|
`ifdef FPGA_SYN_1THREAD
|
|
|
|
`ifdef FPGA_SYN_SAVE_BRAM
|
|
|
|
|
|
module bw_r_irf_register(clk, wren, save, save_addr, restore, restore_addr, wr_data, rd_data);
|
|
input clk;
|
|
input wren;
|
|
input save;
|
|
input [2:0] save_addr;
|
|
input restore;
|
|
input [2:0] restore_addr;
|
|
input [71:0] wr_data;
|
|
output [71:0] rd_data;
|
|
`ifdef FPGA_SYN_ALTERA
|
|
reg [35:0] window[15:0]/* synthesis syn_ramstyle = block_ram*/; // syn_ramstyle = no_rw_check */;
|
|
`else
|
|
reg [35:0] window[15:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */;
|
|
`endif
|
|
reg [71:0] onereg;
|
|
|
|
initial onereg = 72'h0;
|
|
|
|
assign rd_data = onereg;
|
|
|
|
reg [71:0] restore_data;
|
|
wire [71:0] wrdata = restore ? restore_data : wr_data;
|
|
|
|
wire wr_en = wren | restore;
|
|
|
|
always @(posedge clk) begin
|
|
if(wr_en) onereg <= wrdata;
|
|
end
|
|
|
|
wire [2:0] addr = save ? save_addr : restore_addr;
|
|
|
|
wire [3:0] addr1 = {1'b1, addr};
|
|
wire [3:0] addr0 = {1'b0, addr};
|
|
|
|
always @(negedge clk) begin
|
|
if(save) window[addr1] <= wren ? wr_data[71:36] : rd_data[71:36];
|
|
else restore_data[71:36] <= window[addr1];
|
|
end
|
|
|
|
always @(negedge clk) begin
|
|
if(save) window[addr0] <= wren ? wr_data[35:0] : rd_data[35:0];
|
|
else restore_data[35:0] <= window[addr0];
|
|
end
|
|
|
|
|
|
endmodule
|
|
|
|
|
|
`else
|
|
|
|
|
|
module bw_r_irf_register(clk, wren, save, save_addr, restore, restore_addr, wr_data, rd_data);
|
|
input clk;
|
|
input wren;
|
|
input save;
|
|
input [2:0] save_addr;
|
|
input restore;
|
|
input [2:0] restore_addr;
|
|
input [71:0] wr_data;
|
|
output [71:0] rd_data;
|
|
`ifdef FPGA_SYN_ALTERA
|
|
reg [71:0] window[7:0]/* synthesis syn_ramstyle = block_ram*/; // syn_ramstyle = no_rw_check */;
|
|
`else
|
|
reg [71:0] window[7:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */;
|
|
`endif
|
|
reg [71:0] onereg;
|
|
|
|
reg [2:0] rd_addr;
|
|
reg [2:0] wr_addr;
|
|
reg save_d;
|
|
`ifdef FPGA_SYN_ALTERA
|
|
integer k;
|
|
|
|
initial
|
|
begin
|
|
for (k = 0; k < 8 ; k = k + 1)
|
|
begin
|
|
window[k] = 72'h0;
|
|
end
|
|
end
|
|
`endif
|
|
|
|
initial
|
|
begin
|
|
onereg = 72'b0;
|
|
wr_addr = 3'h0;
|
|
rd_addr = 3'h0;
|
|
end
|
|
|
|
always @(negedge clk) begin
|
|
rd_addr = restore_addr;
|
|
end
|
|
|
|
always @(posedge clk) begin
|
|
wr_addr <= save_addr;
|
|
end
|
|
always @(posedge clk) begin
|
|
save_d <= save;
|
|
end
|
|
|
|
assign rd_data = onereg;
|
|
|
|
wire [71:0] restore_data = window[rd_addr];
|
|
wire [71:0] wrdata = restore ? restore_data : wr_data;
|
|
|
|
wire wr_en = wren | (restore & (wr_addr != rd_addr));
|
|
|
|
always @(posedge clk) begin
|
|
if(wr_en) onereg <= wrdata;
|
|
end
|
|
|
|
always @(negedge clk) begin
|
|
if(save_d) window[wr_addr] <= rd_data;
|
|
end
|
|
|
|
endmodule
|
|
|
|
`endif
|
|
|
|
`else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module bw_r_irf_register(clk, wrens, save, save_addr, restore, restore_addr, wr_data0, wr_data1, wr_data2, wr_data3, rd_thread, rd_data);
|
module bw_r_irf_register(clk, wrens, save, save_addr, restore, restore_addr, wr_data0, wr_data1, wr_data2, wr_data3, rd_thread, rd_data);
|
input clk;
|
input clk;
|
input [3:0] wrens;
|
input [3:0] wrens;
|
input save;
|
input save;
|
input [4:0] save_addr;
|
input [4:0] save_addr;
|
input restore;
|
input restore;
|
input [4:0] restore_addr;
|
input [4:0] restore_addr;
|
input [71:0] wr_data0;
|
input [71:0] wr_data0;
|
input [71:0] wr_data1;
|
input [71:0] wr_data1;
|
input [71:0] wr_data2;
|
input [71:0] wr_data2;
|
input [71:0] wr_data3;
|
input [71:0] wr_data3;
|
input [1:0] rd_thread;
|
input [1:0] rd_thread;
|
output [71:0] rd_data;
|
output [71:0] rd_data;
|
|
`ifdef FPGA_SYN_ALTERA
|
|
reg [71:0] window[31:0]/* synthesis syn_ramstyle = block_ram*/; // syn_ramstyle = no_rw_check */;
|
|
`else
|
reg [71:0] window[31:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */;
|
reg [71:0] window[31:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */;
|
|
`endif
|
reg [71:0] reg_th0, reg_th1, reg_th2, reg_th3;
|
reg [71:0] reg_th0, reg_th1, reg_th2, reg_th3;
|
|
|
reg [4:0] rd_addr;
|
reg [4:0] rd_addr;
|
reg [4:0] wr_addr;
|
reg [4:0] wr_addr;
|
reg save_d;
|
reg save_d;
|
|
|
initial begin
|
initial begin
|
reg_th0 = 72'b0;
|
reg_th0 = 72'b0;
|
reg_th1 = 72'b0;
|
reg_th1 = 72'b0;
|
reg_th2 = 72'b0;
|
reg_th2 = 72'b0;
|
reg_th3 = 72'b0;
|
reg_th3 = 72'b0;
|
end
|
end
|
|
|
bw_r_irf_72_4x1_mux mux4_1(
|
bw_r_irf_72_4x1_mux mux4_1(
|
.sel(rd_thread),
|
.sel(rd_thread),
|
.x0(reg_th0),
|
.x0(reg_th0),
|
.x1(reg_th1),
|
.x1(reg_th1),
|
.x2(reg_th2),
|
.x2(reg_th2),
|
.x3(reg_th3),
|
.x3(reg_th3),
|
.y(rd_data)
|
.y(rd_data)
|
);
|
);
|
|
|
always @(negedge clk) begin
|
always @(negedge clk) begin
|
rd_addr = restore_addr;
|
rd_addr = restore_addr;
|
end
|
end
|
|
|
wire [71:0] restore_data = window[rd_addr];
|
wire [71:0] restore_data = window[rd_addr];
|
|
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
wr_addr <= save_addr;
|
wr_addr <= save_addr;
|
end
|
end
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
save_d <= save;
|
save_d <= save;
|
end
|
end
|
|
|
wire [71:0] save_data;
|
wire [71:0] save_data;
|
|
|
bw_r_irf_72_4x1_mux mux4_2(
|
bw_r_irf_72_4x1_mux mux4_2(
|
.sel(wr_addr[4:3]),
|
.sel(wr_addr[4:3]),
|
.x0(reg_th0),
|
.x0(reg_th0),
|
.x1(reg_th1),
|
.x1(reg_th1),
|
.x2(reg_th2),
|
.x2(reg_th2),
|
.x3(reg_th3),
|
.x3(reg_th3),
|
.y(save_data)
|
.y(save_data)
|
);
|
);
|
|
|
always @(negedge clk) begin
|
always @(negedge clk) begin
|
if(save_d) window[wr_addr] <= save_data;
|
if(save_d) window[wr_addr] <= save_data;
|
end
|
end
|
|
|
//Register implementation for 4 threads / 2 write & 1 restore port
|
//Register implementation for 4 threads / 2 write & 1 restore port
|
|
|
wire [3:0] restores = (1'b1 << rd_addr[4:3]) & {4{restore}};
|
wire [3:0] restores = (1'b1 << rd_addr[4:3]) & {4{restore}};
|
//wire [3:0] wren1s = (1'b1 << wr1_th) & {4{wren1}};
|
//wire [3:0] wren1s = (1'b1 << wr1_th) & {4{wren1}};
|
//wire [3:0] wren2s = (1'b1 << wr2_th) & {4{wren2}};
|
//wire [3:0] wren2s = (1'b1 << wr2_th) & {4{wren2}};
|
|
|
wire [71:0] wrdata0, wrdata1, wrdata2, wrdata3;
|
wire [71:0] wrdata0, wrdata1, wrdata2, wrdata3;
|
|
|
bw_r_irf_72_2x1_mux mux2_5(
|
bw_r_irf_72_2x1_mux mux2_5(
|
.sel(restores[0]),
|
.sel(restores[0]),
|
.x0(wr_data0),
|
.x0(wr_data0),
|
.x1(restore_data),
|
.x1(restore_data),
|
.y(wrdata0)
|
.y(wrdata0)
|
);
|
);
|
|
|
bw_r_irf_72_2x1_mux mux2_6(
|
bw_r_irf_72_2x1_mux mux2_6(
|
.sel(restores[1]),
|
.sel(restores[1]),
|
.x0(wr_data1),
|
.x0(wr_data1),
|
.x1(restore_data),
|
.x1(restore_data),
|
.y(wrdata1)
|
.y(wrdata1)
|
);
|
);
|
|
|
bw_r_irf_72_2x1_mux mux2_7(
|
bw_r_irf_72_2x1_mux mux2_7(
|
.sel(restores[2]),
|
.sel(restores[2]),
|
.x0(wr_data2),
|
.x0(wr_data2),
|
.x1(restore_data),
|
.x1(restore_data),
|
.y(wrdata2)
|
.y(wrdata2)
|
);
|
);
|
|
|
bw_r_irf_72_2x1_mux mux2_8(
|
bw_r_irf_72_2x1_mux mux2_8(
|
.sel(restores[3]),
|
.sel(restores[3]),
|
.x0(wr_data3),
|
.x0(wr_data3),
|
.x1(restore_data),
|
.x1(restore_data),
|
.y(wrdata3)
|
.y(wrdata3)
|
);
|
);
|
|
|
//wire [3:0] wr_en = wren1s | wren2s | (restores & {4{(wr_addr[4:0] != rd_addr[4:0])}});
|
//wire [3:0] wr_en = wren1s | wren2s | (restores & {4{(wr_addr[4:0] != rd_addr[4:0])}});
|
wire [3:0] wr_en = wrens | (restores & {4{(wr_addr[4:0] != rd_addr[4:0])}});
|
wire [3:0] wr_en = wrens | (restores & {4{(wr_addr[4:0] != rd_addr[4:0])}});
|
|
|
//288 Flops
|
//288 Flops
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
if(wr_en[0]) reg_th0 <= wrdata0;
|
if(wr_en[0]) reg_th0 <= wrdata0;
|
if(wr_en[1]) reg_th1 <= wrdata1;
|
if(wr_en[1]) reg_th1 <= wrdata1;
|
if(wr_en[2]) reg_th2 <= wrdata2;
|
if(wr_en[2]) reg_th2 <= wrdata2;
|
if(wr_en[3]) reg_th3 <= wrdata3;
|
if(wr_en[3]) reg_th3 <= wrdata3;
|
end
|
end
|
|
|
endmodule
|
endmodule
|
|
|
|
|
module bw_r_irf_72_4x1_mux(sel, y, x0, x1, x2, x3);
|
module bw_r_irf_72_4x1_mux(sel, y, x0, x1, x2, x3);
|
input [1:0] sel;
|
input [1:0] sel;
|
input [71:0] x0;
|
input [71:0] x0;
|
input [71:0] x1;
|
input [71:0] x1;
|
input [71:0] x2;
|
input [71:0] x2;
|
input [71:0] x3;
|
input [71:0] x3;
|
output [71:0] y;
|
output [71:0] y;
|
reg [71:0] y;
|
reg [71:0] y;
|
|
|
always @(sel or x0 or x1 or x2 or x3)
|
always @(sel or x0 or x1 or x2 or x3)
|
case(sel)
|
case(sel)
|
2'b00: y = x0;
|
2'b00: y = x0;
|
2'b01: y = x1;
|
2'b01: y = x1;
|
2'b10: y = x2;
|
2'b10: y = x2;
|
2'b11: y = x3;
|
2'b11: y = x3;
|
endcase
|
endcase
|
|
|
endmodule
|
endmodule
|
|
|
|
|
module bw_r_irf_72_2x1_mux(sel, y, x0, x1);
|
module bw_r_irf_72_2x1_mux(sel, y, x0, x1);
|
input sel;
|
input sel;
|
input [71:0] x0;
|
input [71:0] x0;
|
input [71:0] x1;
|
input [71:0] x1;
|
output [71:0] y;
|
output [71:0] y;
|
reg [71:0] y;
|
reg [71:0] y;
|
|
|
always @(sel or x0 or x1)
|
always @(sel or x0 or x1)
|
case(sel)
|
case(sel)
|
1'b0: y = x0;
|
1'b0: y = x0;
|
1'b1: y = x1;
|
1'b1: y = x1;
|
endcase
|
endcase
|
|
|
endmodule
|
endmodule
|
|
|
|
`endif
|
|
|
|
|
|
|