Line 24... |
Line 24... |
// Description: This is the floating point register file. It has one R/W port that is
|
// Description: This is the floating point register file. It has one R/W port that is
|
// 78 bits (64 bits data, 14 bits ecc) wide.
|
// 78 bits (64 bits data, 14 bits ecc) wide.
|
*/
|
*/
|
|
|
//FPGA_SYN enables all FPGA related modifications
|
//FPGA_SYN enables all FPGA related modifications
|
|
`ifdef FPGA_SYN
|
|
`define FPGA_SYN_FRF
|
|
`endif
|
|
|
module bw_r_frf (/*AUTOARG*/
|
module bw_r_frf (/*AUTOARG*/
|
// Outputs
|
// Outputs
|
so, frf_dp_data,
|
so, frf_dp_data,
|
// Inputs
|
// Inputs
|
Line 50... |
Line 50... |
output so;
|
output so;
|
output [77:0] frf_dp_data;
|
output [77:0] frf_dp_data;
|
|
|
wire [7:0] regfile_index;
|
wire [7:0] regfile_index;
|
//XST WA CR436004
|
//XST WA CR436004
|
wire [7:0] regfile_index_low;
|
(* keep = "yes" *) wire [7:0] regfile_index_low;
|
wire [7:0] regfile_index_high;
|
(* keep = "yes" *) wire [7:0] regfile_index_high;
|
//
|
//
|
|
|
|
`ifdef FPGA_SYN_FRF
|
reg [38:0] regfile_high [127:0];
|
reg [38:0] regfile_high [127:0];
|
reg [38:0] regfile_low [127:0];
|
reg [38:0] regfile_low [127:0];
|
|
`else
|
|
reg [38:0] regfile [255:0];
|
|
`endif
|
|
|
reg rst_tri_en_negedge;
|
reg rst_tri_en_negedge;
|
wire [77:0] read_data;
|
wire [77:0] read_data;
|
wire ren_d1;
|
wire ren_d1;
|
wire [6:0] addr_d1;
|
wire [6:0] addr_d1;
|
Line 89... |
Line 89... |
|
|
assign sehold_write_data[77:0] = (sehold)? write_data_d1[77:0]: dp_frf_data[77:0];
|
assign sehold_write_data[77:0] = (sehold)? write_data_d1[77:0]: dp_frf_data[77:0];
|
assign sehold_cntl_data[9:0] = (sehold)? {addr_d1[6:0],wen_d1[1:0], ren_d1}:
|
assign sehold_cntl_data[9:0] = (sehold)? {addr_d1[6:0],wen_d1[1:0], ren_d1}:
|
{ctl_frf_addr[6:0],ctl_frf_wen[1:0],ctl_frf_ren};
|
{ctl_frf_addr[6:0],ctl_frf_wen[1:0],ctl_frf_ren};
|
// All inputs go through flop
|
// All inputs go through flop
|
dff #(39) datain_dff1(.din(sehold_write_data[77:39]), .clk(rclk), .q(write_data_d1[77:39]),
|
dff_s #(39) datain_dff1(.din(sehold_write_data[77:39]), .clk(rclk), .q(write_data_d1[77:39]),
|
.se(real_se), .si({cntl_scan_data[0],write_scan_data_lo[38:1]}),
|
.se(real_se), .si({cntl_scan_data[0],write_scan_data_lo[38:1]}),
|
.so(write_scan_data_hi[38:0]));
|
.so(write_scan_data_hi[38:0]));
|
dff #(39) datain_dff2(.din(sehold_write_data[38:0]), .clk(rclk), .q(write_data_d1[38:0]),
|
dff_s #(39) datain_dff2(.din(sehold_write_data[38:0]), .clk(rclk), .q(write_data_d1[38:0]),
|
.se(real_se), .si(write_scan_data_hi[38:0]), .so(write_scan_data_lo[38:0]));
|
.se(real_se), .si(write_scan_data_hi[38:0]), .so(write_scan_data_lo[38:0]));
|
dff #(10) controlin_dff(.din(sehold_cntl_data[9:0]),
|
dff_s #(10) controlin_dff(.din(sehold_cntl_data[9:0]),
|
.q({addr_d1[6:0],wen_d1[1:0],ren_d1}),
|
.q({addr_d1[6:0],wen_d1[1:0],ren_d1}),
|
.clk(rclk), .se(real_se), .si({si,cntl_scan_data[9:1]}), .so(cntl_scan_data[9:0]));
|
.clk(rclk), .se(real_se), .si({si,cntl_scan_data[9:1]}), .so(cntl_scan_data[9:0]));
|
|
|
// Read logic
|
// Read logic
|
|
`ifdef FPGA_SYN_FRF
|
assign read_data[77:0] = (~ren_d1)? 78'b0:
|
assign read_data[77:0] = (~ren_d1)? 78'b0:
|
(wen_d1[1]|wen_d1[0])? {78{1'bx}}:
|
(wen_d1[1]|wen_d1[0])? {78{1'bx}}:
|
{regfile_high[regfile_index_high[7:1]],regfile_low[regfile_index_low[7:1]]};
|
{regfile_high[regfile_index_high[7:1]],regfile_low[regfile_index_low[7:1]]};
|
|
`else
|
|
assign read_data[77:0] = (~ren_d1)? 78'b0:
|
|
(wen_d1[1]|wen_d1[0])? {78{1'bx}}:
|
|
{regfile[regfile_index_high],regfile[regfile_index_low]};
|
|
`endif
|
|
|
|
|
|
dff_s #(39) dataout_dff1(.din(read_data[77:39]), .clk(rclk), .q(frf_dp_data[77:39]),
|
|
|
|
|
|
|
|
|
dff #(39) dataout_dff1(.din(read_data[77:39]), .clk(rclk), .q(frf_dp_data[77:39]),
|
|
.se(real_se), .si(read_scan_data_lo[38:0]), .so(read_scan_data_hi[38:0]));
|
.se(real_se), .si(read_scan_data_lo[38:0]), .so(read_scan_data_hi[38:0]));
|
dff #(39) dataout_dff2(.din(read_data[38:0]), .clk(rclk), .q(frf_dp_data[38:0]),
|
dff_s #(39) dataout_dff2(.din(read_data[38:0]), .clk(rclk), .q(frf_dp_data[38:0]),
|
.se(real_se), .si({read_scan_data_hi[37:0],write_scan_data_lo[0]}),
|
.se(real_se), .si({read_scan_data_hi[37:0],write_scan_data_lo[0]}),
|
.so(read_scan_data_lo[38:0]));
|
.so(read_scan_data_lo[38:0]));
|
assign so = read_scan_data_hi[38];
|
assign so = read_scan_data_hi[38];
|
|
|
always @ (posedge rclk) begin
|
always @ (posedge rclk) begin
|
// Write port
|
// Write port
|
// write is gated by rst_tri_en
|
// write is gated by rst_tri_en
|
|
`ifdef FPGA_SYN_FRF
|
if (wen_d1[0] & ~ren_d1 & ~rst_tri_en_negedge) begin
|
if (wen_d1[0] & ~ren_d1 & ~rst_tri_en_negedge) begin
|
regfile_low[regfile_index_low[7:1]] <= write_data_d1[38:0];
|
regfile_low[regfile_index_low[7:1]] <= write_data_d1[38:0];
|
end
|
end
|
if (wen_d1[1] & ~ren_d1 & ~rst_tri_en_negedge) begin
|
if (wen_d1[1] & ~ren_d1 & ~rst_tri_en_negedge) begin
|
regfile_high[regfile_index_high[7:1]] <= write_data_d1[77:39];
|
regfile_high[regfile_index_high[7:1]] <= write_data_d1[77:39];
|
end
|
end
|
|
`else
|
|
if (wen_d1[0] & ~ren_d1 & ~rst_tri_en_negedge) begin
|
|
regfile[regfile_index_low] <= write_data_d1[38:0];
|
|
end
|
|
if (wen_d1[1] & ~ren_d1 & ~rst_tri_en_negedge) begin
|
|
regfile[regfile_index_high] <= write_data_d1[77:39];
|
|
end
|
|
`endif
|
end
|
end
|
always @ (negedge rclk) begin
|
always @ (negedge rclk) begin
|
// latch rst_tri_en
|
// latch rst_tri_en
|
rst_tri_en_negedge <= rst_tri_en;
|
rst_tri_en_negedge <= rst_tri_en;
|
end
|
end
|