Line 40... |
Line 40... |
|
|
//`include "iop.h"
|
//`include "iop.h"
|
//`include "fabric.h"
|
//`include "fabric.h"
|
|
|
//FPGA_SYN enables all FPGA related modifications
|
//FPGA_SYN enables all FPGA related modifications
|
|
`ifdef FPGA_SYN
|
|
`define FPGA_SYN_DCD
|
|
`endif
|
|
|
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
// Local header file includes / local defines
|
// Local header file includes / local defines
|
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
|
|
Line 119... |
Line 119... |
output [7:0] dcd_fuse_repair_value; //data out for redundancy register
|
output [7:0] dcd_fuse_repair_value; //data out for redundancy register
|
output [1:0] dcd_fuse_repair_en; //enable bits out
|
output [1:0] dcd_fuse_repair_en; //enable bits out
|
|
|
// Memory declaration.
|
// Memory declaration.
|
|
|
|
`ifdef DEFINE_0IN
|
|
wire [143:0] temp_w0a;
|
|
wire [143:0] temp_w1a;
|
|
wire [143:0] temp_w2a;
|
|
wire [143:0] temp_w3a;
|
|
`else
|
reg [143:0] w0 [127:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; // way0, byte0. Data+Parity.
|
reg [143:0] w0 [127:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; // way0, byte0. Data+Parity.
|
reg [143:0] w1 [127:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; // way0, byte0. Data+Parity.
|
reg [143:0] w1 [127:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; // way0, byte0. Data+Parity.
|
reg [143:0] w2 [127:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; // way0, byte0. Data+Parity.
|
reg [143:0] w2 [127:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; // way0, byte0. Data+Parity.
|
reg [143:0] w3 [127:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; // way0, byte0. Data+Parity.
|
reg [143:0] w3 [127:0]/* synthesis syn_ramstyle = block_ram syn_ramstyle = no_rw_check */ ; // way0, byte0. Data+Parity.
|
|
|
Line 144... |
Line 144... |
|
|
reg [143:0] temp_w0;
|
reg [143:0] temp_w0;
|
reg [143:0] temp_w1;
|
reg [143:0] temp_w1;
|
reg [143:0] temp_w2;
|
reg [143:0] temp_w2;
|
reg [143:0] temp_w3;
|
reg [143:0] temp_w3;
|
|
`endif
|
reg [10:3] dcache_rwaddr_m ;
|
reg [10:3] dcache_rwaddr_m ;
|
reg [10:3] dcache_raddr_m ;
|
reg [10:3] dcache_raddr_m ;
|
reg dcache_rvld_m ;
|
reg dcache_rvld_m ;
|
reg wvld_m ;
|
reg wvld_m ;
|
reg [143:0] dcache_wdata_m ;
|
reg [143:0] dcache_wdata_m ;
|
Line 242... |
Line 242... |
end
|
end
|
|
|
assign dcache_wvld_m = wvld_m & ~rst_tri_en ;
|
assign dcache_wvld_m = wvld_m & ~rst_tri_en ;
|
|
|
|
|
|
`ifdef DEFINE_0IN
|
|
wire [3:0] dc_we = dcache_wvld_m ? dcache_wr_rway_m : 4'b0;
|
|
|
|
dc_data dc_data0 ( .nclk(~clk), .adr(dcache_rwaddr_m[10:4]),
|
|
.we(dc_we [0] ), .wm(way_mask [143:0]),
|
|
.din(dcache_wdata_m[143:0]), .dout(temp_w0a[143:0]) );
|
|
dc_data dc_data1 ( .nclk(~clk), .adr(dcache_rwaddr_m[10:4]),
|
|
.we(dc_we [1] ), .wm(way_mask [143:0]),
|
|
.din(dcache_wdata_m[143:0]), .dout(temp_w1a[143:0]) );
|
|
dc_data dc_data2 ( .nclk(~clk), .adr(dcache_rwaddr_m[10:4]),
|
|
.we(dc_we [2] ), .wm(way_mask [143:0]),
|
|
.din(dcache_wdata_m[143:0]), .dout(temp_w2a[143:0]) );
|
|
dc_data dc_data3 ( .nclk(~clk), .adr(dcache_rwaddr_m[10:4]),
|
|
.we(dc_we [3] ), .wm(way_mask [143:0]),
|
|
.din(dcache_wdata_m[143:0]), .dout(temp_w3a[143:0]) );
|
|
`else
|
|
|
|
|
//=========================================================================================
|
//=========================================================================================
|
// generate wordlines
|
// generate wordlines
|
//=========================================================================================
|
//=========================================================================================
|
|
|
// Generate at posedge of clk.
|
// Generate at posedge of clk.
|
Line 278... |
Line 278... |
rw_wdline[ctr] = 1'b0;
|
rw_wdline[ctr] = 1'b0;
|
end
|
end
|
end
|
end
|
*/
|
*/
|
|
|
|
`ifdef FPGA_SYN_DCD
|
|
`else
|
|
always @ (clk or dcache_rwaddr_m or dcache_wvld_m or dcache_rvld_m)
|
|
begin
|
|
if (clk) begin
|
|
for (ctr=8'h00;ctr<128;ctr=ctr+1)
|
|
begin
|
|
if (({1'b0,dcache_rwaddr_m[10:4]} == ctr) &
|
|
(dcache_rvld_m | dcache_wvld_m))
|
|
rw_wdline[ctr] = 1'b1;
|
|
else
|
|
rw_wdline[ctr] = 1'b0;
|
|
end
|
|
end
|
|
end
|
|
// JC modified end
|
|
`endif
|
|
|
|
|
//=========================================================================================
|
//=========================================================================================
|
// Read from Memory.
|
// Read from Memory.
|
//=========================================================================================
|
//=========================================================================================
|
|
|
|
`ifdef FPGA_SYN_DCD
|
always @(posedge clk) begin
|
always @(posedge clk) begin
|
temp_w0a_reg[143:0] = w0[dcache_raddr_e[10:4]];
|
temp_w0a_reg[143:0] = w0[dcache_raddr_e[10:4]];
|
temp_w1a_reg[143:0] = w1[dcache_raddr_e[10:4]];
|
temp_w1a_reg[143:0] = w1[dcache_raddr_e[10:4]];
|
temp_w2a_reg[143:0] = w2[dcache_raddr_e[10:4]];
|
temp_w2a_reg[143:0] = w2[dcache_raddr_e[10:4]];
|
temp_w3a_reg[143:0] = w3[dcache_raddr_e[10:4]];
|
temp_w3a_reg[143:0] = w3[dcache_raddr_e[10:4]];
|
end
|
end
|
|
`else
|
|
// Read
|
|
always @ (negedge clk)
|
|
begin
|
|
for (i=0;i<128;i=i+1)
|
|
begin
|
|
if (rw_wdline[i] & dcache_rvld_m)
|
|
begin
|
|
temp_w0a_reg[143:0] <= w0[i];
|
|
temp_w1a_reg[143:0] <= w1[i];
|
|
temp_w2a_reg[143:0] <= w2[i];
|
|
temp_w3a_reg[143:0] <= w3[i];
|
|
end
|
|
end
|
|
end
|
|
`endif
|
|
|
//removed stablizer, zero out without read
|
//removed stablizer, zero out without read
|
assign temp_w0a[143:0] = dcache_rvld_m? temp_w0a_reg[143:0]: 144'b0;
|
assign temp_w0a[143:0] = dcache_rvld_m? temp_w0a_reg[143:0]: 144'b0;
|
assign temp_w1a[143:0] = dcache_rvld_m? temp_w1a_reg[143:0]: 144'b0;
|
assign temp_w1a[143:0] = dcache_rvld_m? temp_w1a_reg[143:0]: 144'b0;
|
assign temp_w2a[143:0] = dcache_rvld_m? temp_w2a_reg[143:0]: 144'b0;
|
assign temp_w2a[143:0] = dcache_rvld_m? temp_w2a_reg[143:0]: 144'b0;
|
assign temp_w3a[143:0] = dcache_rvld_m? temp_w3a_reg[143:0]: 144'b0;
|
assign temp_w3a[143:0] = dcache_rvld_m? temp_w3a_reg[143:0]: 144'b0;
|
|
|
|
`endif
|
|
|
// Prior to SA, column mux (64(D)+8(P))x4 bits. Assume parity is
|
// Prior to SA, column mux (64(D)+8(P))x4 bits. Assume parity is
|
// at the end of the 144b line. Entry is wX||Parity
|
// at the end of the 144b line. Entry is wX||Parity
|
|
|
// Select either upper or lower 64b from each of the 4 ways.
|
// Select either upper or lower 64b from each of the 4 ways.
|
Line 569... |
Line 569... |
|
|
|
|
always @ (negedge clk)
|
always @ (negedge clk)
|
begin
|
begin
|
|
|
|
`ifdef FPGA_SYN_DCD
|
|
|
if(dcache_wvld_m & dcache_wr_rway_m[0]) begin
|
if(dcache_wvld_m & dcache_wr_rway_m[0]) begin
|
w0[dcache_rwaddr_m[10:4]] = (temp_w0a_reg[143:0] & way_mask_inv[143:0]) |
|
w0[dcache_rwaddr_m[10:4]] = (temp_w0a_reg[143:0] & way_mask_inv[143:0]) |
|
(dcache_wdata_m[143:0] & way_mask[143:0]) ;
|
(dcache_wdata_m[143:0] & way_mask[143:0]) ;
|
end
|
end
|
Line 588... |
Line 588... |
if(dcache_wvld_m & dcache_wr_rway_m[3]) begin
|
if(dcache_wvld_m & dcache_wr_rway_m[3]) begin
|
w3[dcache_rwaddr_m[10:4]] = (temp_w3a_reg[143:0] & way_mask_inv[143:0]) |
|
w3[dcache_rwaddr_m[10:4]] = (temp_w3a_reg[143:0] & way_mask_inv[143:0]) |
|
(dcache_wdata_m[143:0] & way_mask[143:0]) ;
|
(dcache_wdata_m[143:0] & way_mask[143:0]) ;
|
end
|
end
|
|
|
|
`else // !`ifdef FPGA_SYN_DCD
|
|
|
|
for (j=0;j<128;j=j+1)
|
|
begin
|
|
if (rw_wdline[j] & dcache_wvld_m & dcache_wr_rway_m[0])
|
|
begin
|
|
// read
|
|
temp_w0[143:0] = w0[j];
|
|
// modify & write
|
|
w0[j] = (temp_w0[143:0] & way_mask_inv[143:0]) |
|
|
(dcache_wdata_m[143:0] & way_mask[143:0]) ;
|
|
end
|
|
if (rw_wdline[j] & dcache_wvld_m & dcache_wr_rway_m[1])
|
|
begin
|
|
// read
|
|
temp_w1[143:0] = w1[j];
|
|
// modify & write
|
|
w1[j] = (temp_w1[143:0] & way_mask_inv[143:0]) |
|
|
(dcache_wdata_m[143:0] & way_mask[143:0]) ;
|
|
end
|
|
if (rw_wdline[j] & dcache_wvld_m & dcache_wr_rway_m[2])
|
|
begin
|
|
// read
|
|
temp_w2[143:0] = w2[j];
|
|
// modify & write
|
|
w2[j] = (temp_w2[143:0] & way_mask_inv[143:0]) |
|
|
(dcache_wdata_m[143:0] & way_mask[143:0]) ;
|
|
end
|
|
if (rw_wdline[j] & dcache_wvld_m & dcache_wr_rway_m[3])
|
|
begin
|
|
// read
|
|
temp_w3[143:0] = w3[j];
|
|
// modify & write.
|
|
w3[j] = (temp_w3[143:0] & way_mask_inv[143:0]) |
|
|
(dcache_wdata_m[143:0] & way_mask[143:0]) ;
|
|
end
|
|
end
|
|
`endif // !`ifdef FPGA_SYN_DCD
|
// !`ifdef FPGA_SYN_DCD
|
|
|
|
end // always @ (negedge clk)
|
end // always @ (negedge clk)
|
|
|
endmodule
|
endmodule
|
|
|