OpenCores
URL https://opencores.org/ocsvn/s1_core/s1_core/trunk

Subversion Repositories s1_core

[/] [s1_core/] [trunk/] [hdl/] [rtl/] [sparc_core/] [bw_r_frf.v] - Diff between revs 105 and 113

Show entire file | Details | Blame | View Log

Rev 105 Rev 113
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.