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

Subversion Repositories s1_core

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

Show entire file | Details | Blame | View Log

Rev 105 Rev 113
Line 65... Line 65...
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// Local header file includes / local defines
// Local header file includes / local defines
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
 
 
//FPGA_SYN enables all FPGA related modifications
//FPGA_SYN enables all FPGA related modifications
 
`ifdef FPGA_SYN
 
`define FPGA_SYN_IDCT
 
`endif
 
 
 
 
 
 
module bw_r_rf16x32 (/*AUTOARG*/
module bw_r_rf16x32 (/*AUTOARG*/
   // Outputs
   // Outputs
Line 115... Line 115...
   //----------------------------------------------------------------------
   //----------------------------------------------------------------------
   // local signals
   // local signals
   wire [6:0]    rd_index ;
   wire [6:0]    rd_index ;
 
 
   // 512 bit array  
   // 512 bit array  
 
`ifdef FPGA_SYN_IDCT
   reg [31:0]    idcv_ary_0000;
   reg [31:0]    idcv_ary_0000;
   reg [31:0]    idcv_ary_0001;
   reg [31:0]    idcv_ary_0001;
   reg [31:0]    idcv_ary_0010;
   reg [31:0]    idcv_ary_0010;
   reg [31:0]    idcv_ary_0011;
   reg [31:0]    idcv_ary_0011;
   reg [31:0]    idcv_ary_0100;
   reg [31:0]    idcv_ary_0100;
Line 132... Line 132...
   reg [31:0]    idcv_ary_1011;
   reg [31:0]    idcv_ary_1011;
   reg [31:0]    idcv_ary_1100;
   reg [31:0]    idcv_ary_1100;
   reg [31:0]    idcv_ary_1101;
   reg [31:0]    idcv_ary_1101;
   reg [31:0]    idcv_ary_1110;
   reg [31:0]    idcv_ary_1110;
   reg [31:0]    idcv_ary_1111;
   reg [31:0]    idcv_ary_1111;
 
`else
 
   reg [511:0]   idcv_ary;
 
`endif
 
 
   reg [3:0]     vbit,
   reg [3:0]     vbit,
                vbit_sa;
                vbit_sa;
 
 
   reg [6:2]    wr_index_d1;
   reg [6:2]    wr_index_d1;
Line 147... Line 147...
   reg          rdreq_d1,
   reg          rdreq_d1,
                            wrreq_d1;
                            wrreq_d1;
 
 
   reg [15:0]   bit_wen_d1;
   reg [15:0]   bit_wen_d1;
   reg          din_d1;
   reg          din_d1;
 
   reg [4:0] index;
 
 
   wire         rst_all;
   wire         rst_all;
 
 
   //----------------------------------------------------------------------
   //----------------------------------------------------------------------
   // Code Begins Here
   // Code Begins Here
Line 176... Line 177...
 
 
 
 
   //----------------------------------------------------------------------
   //----------------------------------------------------------------------
   // Read Operation
   // Read Operation
   //----------------------------------------------------------------------
   //----------------------------------------------------------------------
 
`ifdef FPGA_SYN_IDCT
   always @(/*AUTOSENSE*/
   always @(/*AUTOSENSE*/
            idcv_ary_0000 or idcv_ary_0001 or idcv_ary_0010 or idcv_ary_0011 or
            idcv_ary_0000 or idcv_ary_0001 or idcv_ary_0010 or idcv_ary_0011 or
            idcv_ary_0100 or idcv_ary_1001 or idcv_ary_1010 or idcv_ary_0111 or
            idcv_ary_0100 or idcv_ary_1001 or idcv_ary_1010 or idcv_ary_0111 or
            idcv_ary_1000 or idcv_ary_0101 or idcv_ary_0110 or idcv_ary_1011 or
            idcv_ary_1000 or idcv_ary_0101 or idcv_ary_0110 or idcv_ary_1011 or
            idcv_ary_1100 or idcv_ary_1101 or idcv_ary_1110 or idcv_ary_1111 or rd_index_d1 or rdreq_d1)
            idcv_ary_1100 or idcv_ary_1101 or idcv_ary_1110 or idcv_ary_1111 or rd_index_d1 or rdreq_d1)
 
`else
 
   always @(/*AUTOSENSE*/idcv_ary or rd_index_d1 or rdreq_d1)
 
`endif
     begin
     begin
              if (rdreq_d1)  // should work even if there is read
              if (rdreq_d1)  // should work even if there is read
                                   // write conflict.  Data can be latest
                                   // write conflict.  Data can be latest
                             // or previous but should not be x
                             // or previous but should not be x
                begin
                begin
 
`ifdef FPGA_SYN_IDCT
            case(rd_index_d1[1:0])
            case(rd_index_d1[1:0])
              2'b00: begin
              2'b00: begin
              vbit[0] = idcv_ary_0000[{rd_index_d1[6:2]}];
              vbit[0] = idcv_ary_0000[{rd_index_d1[6:2]}];
              vbit[1] = idcv_ary_0001[{rd_index_d1[6:2]}];
              vbit[1] = idcv_ary_0001[{rd_index_d1[6:2]}];
              vbit[2] = idcv_ary_0010[{rd_index_d1[6:2]}];
              vbit[2] = idcv_ary_0010[{rd_index_d1[6:2]}];
Line 217... Line 218...
              vbit[1] = idcv_ary_1101[{rd_index_d1[6:2]}];
              vbit[1] = idcv_ary_1101[{rd_index_d1[6:2]}];
              vbit[2] = idcv_ary_1110[{rd_index_d1[6:2]}];
              vbit[2] = idcv_ary_1110[{rd_index_d1[6:2]}];
              vbit[3] = idcv_ary_1111[{rd_index_d1[6:2]}];
              vbit[3] = idcv_ary_1111[{rd_index_d1[6:2]}];
              end
              end
            endcase
            endcase
 
`else
 
                   vbit[0] = idcv_ary[{rd_index_d1, 2'b00}]; // way 0
 
                   vbit[1] = idcv_ary[{rd_index_d1, 2'b01}]; // way 1
 
                   vbit[2] = idcv_ary[{rd_index_d1, 2'b10}]; // way 2
 
                   vbit[3] = idcv_ary[{rd_index_d1, 2'b11}]; // way 3
 
`endif
                end     // if (rdreq_d1)
                end     // if (rdreq_d1)
 
 
        else      // i/dcache disabled or rd disabled
        else      // i/dcache disabled or rd disabled
          begin
          begin
             vbit[3:0] = 4'bx;
             vbit[3:0] = 4'bx;
Line 237... Line 238...
   // 12/06 modified to be
   // 12/06 modified to be
   // 0  0  0
   // 0  0  0
   // 0  1  X
   // 0  1  X
   // 1  0  0
   // 1  0  0
   // 1  1  1
   // 1  1  1
 
`ifdef FPGA_SYN_IDCT
 
    initial
 
    begin
 
        for(index = 5'h0; index < 5'h1f; index = index+1)
 
        begin
 
            idcv_ary_0000[index] = 1'b0;
 
            idcv_ary_0001[index] = 1'b0;
 
            idcv_ary_0010[index] = 1'b0;
 
            idcv_ary_0011[index] = 1'b0;
 
            idcv_ary_0100[index] = 1'b0;
 
            idcv_ary_0101[index] = 1'b0;
 
            idcv_ary_0110[index] = 1'b0;
 
            idcv_ary_0111[index] = 1'b0;
 
            idcv_ary_1000[index] = 1'b0;
 
            idcv_ary_1001[index] = 1'b0;
 
            idcv_ary_1010[index] = 1'b0;
 
            idcv_ary_1011[index] = 1'b0;
 
            idcv_ary_1100[index] = 1'b0;
 
            idcv_ary_1101[index] = 1'b0;
 
            idcv_ary_1110[index] = 1'b0;
 
            idcv_ary_1111[index] = 1'b0;
 
        end
 
    end
 
`endif
   reg [3:0] wr_data;
   reg [3:0] wr_data;
   always @ (/*AUTOSENSE*/bit_wen_d1 or rd_index_d1 or rst_all
   always @ (/*AUTOSENSE*/bit_wen_d1 or rd_index_d1 or rst_all
             or wr_index_d1 or wrreq_d1)
             or wr_index_d1 or wrreq_d1)
     begin
     begin
        if (rd_index_d1[6:2] == wr_index_d1[6:2])
        if (rd_index_d1[6:2] == wr_index_d1[6:2])
Line 253... Line 277...
          endcase // case(rd_index_d1[1:0])
          endcase // case(rd_index_d1[1:0])
        else
        else
          wr_data = 4'b0;
          wr_data = 4'b0;
     end
     end
 
 
 
`ifdef FPGA_SYN_IDCT
  assign dout[3:0] = (~reset_l | ~rdreq_d1) ? 4'b0000 :
  assign dout[3:0] = (~reset_l | ~rdreq_d1) ? 4'b0000 :
                     (~wr_data & vbit | wr_data & {4{din_d1}} & vbit);
                     (~wr_data & vbit | wr_data & {4{din_d1}} & vbit);
 
`else
 
 
 
   // SA latch -- to make 0in happy
 
   always @ (/*AUTOSENSE*/clk or din_d1 or vbit or wr_data)
 
     begin
 
        if (clk)
 
          begin
 
             vbit_sa <= (~wr_data & vbit |
 
                         wr_data & {4{din_d1}} & (vbit | 4'bxxxx));
 
          end
 
     end
 
 
 
 
 
// bug:2776 - remove holding the last read value
 
// reset_l  rdreq_d1  dout
 
//  0       -         0
 
//  1       0         0
 
//  1       1         vbit_sa
 
 
 
   assign dout[3:0] = (~reset_l | ~rdreq_d1) ? 4'b0000 : vbit_sa[3:0] ;
 
 
 
`endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   //----------------------------------------------------------------------
   //----------------------------------------------------------------------
   // Write Operation
   // Write Operation
   //----------------------------------------------------------------------
   //----------------------------------------------------------------------
Line 293... Line 317...
   always @ (negedge clk)
   always @ (negedge clk)
     begin
     begin
              if (wrreq_d1 & ~rst_all)  // should work even if rd-wr conflict
              if (wrreq_d1 & ~rst_all)  // should work even if rd-wr conflict
                begin
                begin
             // line 0 (5:4=00)
             // line 0 (5:4=00)
 
`ifdef FPGA_SYN_IDCT
                   if (bit_wen_d1[0]) idcv_ary_0000[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[0]) idcv_ary_0000[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[1]) idcv_ary_0001[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[1]) idcv_ary_0001[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[2]) idcv_ary_0010[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[2]) idcv_ary_0010[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[3]) idcv_ary_0011[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[3]) idcv_ary_0011[{wr_index_d1[6:2]}] = din_d1;
 
`else
 
                   if (bit_wen_d1[0])
 
                     idcv_ary[{wr_index_d1[6:2],2'b00,2'b00}] = din_d1;
 
                   if (bit_wen_d1[1])
 
                     idcv_ary[{wr_index_d1[6:2],2'b00,2'b01}] = din_d1;
 
                   if (bit_wen_d1[2])
 
                     idcv_ary[{wr_index_d1[6:2],2'b00,2'b10}] = din_d1;
 
                   if (bit_wen_d1[3])
 
                     idcv_ary[{wr_index_d1[6:2],2'b00,2'b11}] = din_d1;
 
`endif
 
 
             // line 1 (5:4=01)
             // line 1 (5:4=01)
 
`ifdef FPGA_SYN_IDCT
                   if (bit_wen_d1[4]) idcv_ary_0100[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[4]) idcv_ary_0100[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[5]) idcv_ary_0101[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[5]) idcv_ary_0101[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[6]) idcv_ary_0110[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[6]) idcv_ary_0110[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[7]) idcv_ary_0111[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[7]) idcv_ary_0111[{wr_index_d1[6:2]}] = din_d1;
 
`else
 
                   if (bit_wen_d1[4])
 
                     idcv_ary[{wr_index_d1[6:2],2'b01,2'b00}] = din_d1;
 
                   if (bit_wen_d1[5])
 
                     idcv_ary[{wr_index_d1[6:2],2'b01,2'b01}] = din_d1;
 
                   if (bit_wen_d1[6])
 
                     idcv_ary[{wr_index_d1[6:2],2'b01,2'b10}] = din_d1;
 
                   if (bit_wen_d1[7])
 
                     idcv_ary[{wr_index_d1[6:2],2'b01,2'b11}] = din_d1;
 
`endif
 
 
             // line 2 (5:4=10)
             // line 2 (5:4=10)
 
`ifdef FPGA_SYN_IDCT
                   if (bit_wen_d1[8]) idcv_ary_1000[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[8]) idcv_ary_1000[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[9]) idcv_ary_1001[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[9]) idcv_ary_1001[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[10]) idcv_ary_1010[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[10]) idcv_ary_1010[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[11]) idcv_ary_1011[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[11]) idcv_ary_1011[{wr_index_d1[6:2]}] = din_d1;
 
`else
 
                   if (bit_wen_d1[8])
 
                     idcv_ary[{wr_index_d1[6:2],2'b10,2'b00}] = din_d1;
 
                   if (bit_wen_d1[9])
 
                     idcv_ary[{wr_index_d1[6:2],2'b10,2'b01}] = din_d1;
 
                   if (bit_wen_d1[10])
 
                     idcv_ary[{wr_index_d1[6:2],2'b10,2'b10}] = din_d1;
 
                   if (bit_wen_d1[11])
 
                     idcv_ary[{wr_index_d1[6:2],2'b10,2'b11}] = din_d1;
 
`endif
 
 
             // line 3 (5:4=11)
             // line 3 (5:4=11)
 
`ifdef FPGA_SYN_IDCT
                   if (bit_wen_d1[12]) idcv_ary_1100[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[12]) idcv_ary_1100[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[13]) idcv_ary_1101[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[13]) idcv_ary_1101[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[14]) idcv_ary_1110[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[14]) idcv_ary_1110[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[15]) idcv_ary_1111[{wr_index_d1[6:2]}] = din_d1;
                   if (bit_wen_d1[15]) idcv_ary_1111[{wr_index_d1[6:2]}] = din_d1;
 
`else
 
                   if (bit_wen_d1[12])
 
                     idcv_ary[{wr_index_d1[6:2],2'b11,2'b00}] = din_d1;
 
                   if (bit_wen_d1[13])
 
                     idcv_ary[{wr_index_d1[6:2],2'b11,2'b01}] = din_d1;
 
                   if (bit_wen_d1[14])
 
                     idcv_ary[{wr_index_d1[6:2],2'b11,2'b10}] = din_d1;
 
                   if (bit_wen_d1[15])
 
                     idcv_ary[{wr_index_d1[6:2],2'b11,2'b11}] = din_d1;
 
`endif
 
 
                end
                end
     end // always @ (...
     end // always @ (...
 
 
 
 
// synopsys translate_off
// synopsys translate_off
//----------------------------------------------------------------
//----------------------------------------------------------------
// Monitors, shadow logic and other stuff not directly related to
// Monitors, shadow logic and other stuff not directly related to
// memory functionality
// memory functionality
//----------------------------------------------------------------
//----------------------------------------------------------------
 
`ifdef INNO_MUXEX
 
`else
   // Address monitor
   // Address monitor
   always @ (/*AUTOSENSE*/rd_index_d1 or rdreq_d1 or wr_index_d1
   always @ (/*AUTOSENSE*/rd_index_d1 or rdreq_d1 or wr_index_d1
             or wrreq_d1)
             or wrreq_d1)
     begin
     begin
        if (rdreq_d1 && (rd_index_d1 == 7'bX))
        if (rdreq_d1 && (rd_index_d1 == 7'bX))
          begin
          begin
             // 0in <fire -message "FATAL ERROR: bw_r_rf16x32 read address X"
             // 0in <fire -message "FATAL ERROR: bw_r_rf16x32 read address X"
 
`ifdef DEFINE_0IN
 
`else
          //$display("RFRDADDR", "Error: bw_r_rf16x32 read address is %b\n", rd_index_d1);
          //$error("RFRDADDR", "Error: bw_r_rf16x32 read address is %b\n", rd_index_d1);
 
`endif
          end
          end
        else if (wrreq_d1 && (wr_index_d1 == 5'bX))
        else if (wrreq_d1 && (wr_index_d1 == 5'bX))
          begin
          begin
             // 0in <fire -message "FATAL ERROR: bw_r_rf16x32 write address X"
             // 0in <fire -message "FATAL ERROR: bw_r_rf16x32 write address X"
 
`ifdef DEFINE_0IN
 
`else
          //$display("RFWRADDR", "Error: bw_r_rf16x32 write address is %b\n", wr_index_d1);
          //$error("RFWRADDR", "Error: bw_r_rf16x32 write address is %b\n", wr_index_d1);
 
`endif
          end
          end
     end // always @ (...
     end // always @ (...
 
 
 
 
 // !`ifdef INNO_MUXEX
`endif // !`ifdef INNO_MUXEX
 
 
 
 
//reg [127:0] w0;
//reg [127:0] w0;
//reg [127:0] w1;
//reg [127:0] w1;
//reg [127:0] w2;
//reg [127:0] w2;

powered by: WebSVN 2.1.0

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