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

Subversion Repositories robust_reg

[/] [robust_reg/] [trunk/] [src/] [base/] [regfile.v] - Diff between revs 11 and 14

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 11 Rev 14
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
////                                                             ////
////                                                             ////
////  Author: Eyal Hochberg                                      ////
////  Author: Eyal Hochberg                                      ////
////          eyal@provartec.com                                 ////
////          eyal@provartec.com                                 ////
////                                                             ////
////                                                             ////
////  Downloaded from: http://www.opencores.org                  ////
////  Downloaded from: http://www.opencores.org                  ////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
////                                                             ////
////                                                             ////
//// Copyright (C) 2010 Provartec LTD                            ////
//// Copyright (C) 2010 Provartec LTD                            ////
//// www.provartec.com                                           ////
//// www.provartec.com                                           ////
//// info@provartec.com                                          ////
//// info@provartec.com                                          ////
////                                                             ////
////                                                             ////
//// This source file may be used and distributed without        ////
//// This source file may be used and distributed without        ////
//// restriction provided that this copyright statement is not   ////
//// restriction provided that this copyright statement is not   ////
//// removed from the file and that any derivative work contains ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// the original copyright notice and the associated disclaimer.////
////                                                             ////
////                                                             ////
//// This source file is free software; you can redistribute it  ////
//// This source file is free software; you can redistribute it  ////
//// and/or modify it under the terms of the GNU Lesser General  ////
//// and/or modify it under the terms of the GNU Lesser General  ////
//// Public License as published by the Free Software Foundation.////
//// Public License as published by the Free Software Foundation.////
////                                                             ////
////                                                             ////
//// This source is distributed in the hope that it will be      ////
//// This source is distributed in the hope that it will be      ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied  ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied  ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     ////
//// PURPOSE.  See the GNU Lesser General Public License for more////
//// PURPOSE.  See the GNU Lesser General Public License for more////
//// details. http://www.gnu.org/licenses/lgpl.html              ////
//// details. http://www.gnu.org/licenses/lgpl.html              ////
////                                                             ////
////                                                             ////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
 
 
OUTFILE REGNAME_regfile.v
OUTFILE REGNAME_regfile.v
INCLUDE def_regfile.txt
INCLUDE def_regfile.txt
 
 
ITER RX REG_NUM
ITER RX GROUP_REGS.NUM
 
 
module REGNAME_regfile (PORTS);
module REGNAME_regfile (PORTS);
 
 
   parameter            ADDR_BITS = 16;
   parameter            ADDR_BITS = 16;
 
 
   input                clk;
   input                clk;
   input                reset;
   input                reset;
   port                 GROUP_APB;
   port                 GROUP_APB;
 
 
 
 
   input                GROUP_REGRX.SON(TYPE == TYPE_RO);
   input                GROUP_REGRX.SON(TYPE == TYPE_RO);
   output               GROUP_REGRX.SON(TYPE == TYPE_RW);
   output               GROUP_REGRX.SON(TYPE == TYPE_RW);
   output               wr_GROUP_REGRX.SON(TYPE == TYPE_WO);
   output               wr_GROUP_REGRX.SON(TYPE == TYPE_WO);
   output               GROUP_REGRX.SON(TYPE == TYPE_IW);
   output               GROUP_REGRX.SON(TYPE == TYPE_IW);
 
 
 
 
   wire                 gpwrite;
   wire                 gpwrite;
   wire                 gpread;
   wire                 gpread;
   reg [31:0]           prdata_pre;
   reg [31:0]           prdata_pre;
   reg                  pslverr_pre;
   reg                  pslverr_pre;
   reg [31:0]           prdata;
   reg [31:0]           prdata;
   reg                  pslverr;
   reg                  pslverr;
   reg                  pready;
   reg                  pready;
 
 
   wire
   wire
   STOMP NEWLINE ;;     GONCAT(wr_regGROUP_REGS.SON(TYPE != TYPE_RO).IDX ,);
   STOMP NEWLINE ;;     GONCAT(wr_regGROUP_REGS.SON(TYPE != TYPE_RO).IDX ,);
   reg [31:0]
   reg [31:0]
   STOMP NEWLINE ;;     GONCAT(rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX ,);
   STOMP NEWLINE ;;     GONCAT(rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX ,);
 
 
   reg                  GROUP_REGRX.SON(TYPE == TYPE_IW);
   reg                  GROUP_REGRX.SON(TYPE == TYPE_IW);
   reg                  GROUP_REGRX.SON(TYPE == TYPE_RW);
   reg                  GROUP_REGRX.SON(TYPE == TYPE_RW);
 
 
   wire                 wr_GROUP_REGRX.SON(TYPE == TYPE_WO);
   wire                 wr_GROUP_REGRX.SON(TYPE == TYPE_WO);
   wire                 wr_GROUP_REGRX.SON(TYPE == TYPE_IW);
   wire                 wr_GROUP_REGRX.SON(TYPE == TYPE_IW);
 
 
 
 
   //---------------------- addresses-----------------------------------
   //---------------------- addresses-----------------------------------
   parameter            GROUP_REGS = 'hGROUP_REGS.ADDR;     //GROUP_REGS.DESC
   parameter            GROUP_REGS = 'hGROUP_REGS.ADDR;     //GROUP_REGS.DESC
 
 
   //---------------------- gating -------------------------------------
   //---------------------- gating -------------------------------------
   assign               gpwrite     = psel & (~penable) & pwrite;
   assign               gpwrite     = psel & (~penable) & pwrite;
   assign               gpread      = psel & (~penable) & (~pwrite);
   assign               gpread      = psel & (~penable) & (~pwrite);
 
 
 
 
   //---------------------- Write Operations ---------------------------
   //---------------------- Write Operations ---------------------------
   assign            wr_regGROUP_REGS.SON(TYPE != TYPE_RO).IDX = gpwrite & (paddr == GROUP_REGS);
   assign            wr_regGROUP_REGS.SON(TYPE != TYPE_RO).IDX = gpwrite & (paddr == GROUP_REGS);
 
 
   LOOP RX REG_NUM
   LOOP RX GROUP_REGS.NUM
   IFDEF TRUE(GROUP_REGS[RX].TYPE == TYPE_RW)
   IFDEF TRUE(GROUP_REGS[RX].TYPE == TYPE_RW)
   //GROUP_REGS[RX].DESC
   //GROUP_REGS[RX].DESC
   always @(posedge clk or posedge reset)
   always @(posedge clk or posedge reset)
     if (reset)
     if (reset)
           begin
           begin
             GROUP_REGRX.SON(TYPE==TYPE_RW) <= #FFD GROUP_REGRX.WIDTH'dGROUP_REGRX.DEFAULT;     //GROUP_REGRX.DESC
             GROUP_REGRX.SON(TYPE==TYPE_RW) <= #FFD GROUP_REGRX.WIDTH'dGROUP_REGRX.DEFAULT;     //GROUP_REGRX.DESC
           end
           end
     else if (wr_regRX)
     else if (wr_regRX)
           begin
           begin
             GROUP_REGRX.SON(TYPE==TYPE_RW) <= #FFD pwdata[EXPR(GROUP_REGRX.WIDTH+GROUP_REGRX.START-1):GROUP_REGRX.START];
             GROUP_REGRX.SON(TYPE==TYPE_RW) <= #FFD pwdata[EXPR(GROUP_REGRX.WIDTH+GROUP_REGRX.START-1):GROUP_REGRX.START];
           end
           end
 
 
   ENDIF TRUE(GROUP_REGS[RX].TYPE == TYPE_RW)
   ENDIF TRUE(GROUP_REGS[RX].TYPE == TYPE_RW)
        assign  wr_GROUP_REGRX.SON(TYPE==TYPE_WO) = {GROUP_REGRX.WIDTH{wr_regRX}} & pwdata[EXPR(GROUP_REGRX.WIDTH-1):0];
        assign  wr_GROUP_REGRX.SON(TYPE==TYPE_WO) = {GROUP_REGRX.WIDTH{wr_regRX}} & pwdata[EXPR(GROUP_REGRX.WIDTH-1):0];
        assign  wr_GROUP_REGRX.SON(TYPE==TYPE_IW) = {GROUP_REGRX.WIDTH{wr_regRX}} & pwdata[EXPR(GROUP_REGRX.WIDTH-1):0];
        assign  wr_GROUP_REGRX.SON(TYPE==TYPE_IW) = {GROUP_REGRX.WIDTH{wr_regRX}} & pwdata[EXPR(GROUP_REGRX.WIDTH-1):0];
    ENDLOOP RX
    ENDLOOP RX
 
 
        //---------------------- Read Operations ----------------------------
        //---------------------- Read Operations ----------------------------
     always @(*)
     always @(*)
     begin
     begin
           rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX  = {32{1'b0}};
           rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX  = {32{1'b0}};
 
 
           rd_regRX[EXPR(GROUP_REGRX.WIDTH+GROUP_REGRX.START-1):GROUP_REGRX.START] = GROUP_REGRX.SON(TYPE != TYPE_WO);     //GROUP_REGRX.DESC
           rd_regRX[EXPR(GROUP_REGRX.WIDTH+GROUP_REGRX.START-1):GROUP_REGRX.START] = GROUP_REGRX.SON(TYPE != TYPE_WO);     //GROUP_REGRX.DESC
     end
     end
 
 
   always @(*)
   always @(*)
     begin
     begin
          prdata_pre  = {32{1'b0}};
          prdata_pre  = {32{1'b0}};
 
 
          case (paddr)
          case (paddr)
           GROUP_REGS : prdata_pre = rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX;
           GROUP_REGS : prdata_pre = rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX;
 
 
           default : prdata_pre  = {32{1'b0}};
           default : prdata_pre  = {32{1'b0}};
          endcase
          endcase
     end
     end
 
 
 
 
 always @(paddr or gpread or gpwrite or psel)
 always @(paddr or gpread or gpwrite or psel)
     begin
     begin
          pslverr_pre = 1'b0;
          pslverr_pre = 1'b0;
 
 
          case (paddr)
          case (paddr)
            GROUP_REGS.SON(TYPE==TYPE_RW) : pslverr_pre = 1'b0; //read and write
            GROUP_REGS.SON(TYPE==TYPE_RW) : pslverr_pre = 1'b0; //read and write
            GROUP_REGS.SON(TYPE==TYPE_RO) : pslverr_pre = gpwrite; //read only
            GROUP_REGS.SON(TYPE==TYPE_RO) : pslverr_pre = gpwrite; //read only
            GROUP_REGS.SON(TYPE==TYPE_WO) : pslverr_pre = gpread; //write only
            GROUP_REGS.SON(TYPE==TYPE_WO) : pslverr_pre = gpread; //write only
 
 
           default : pslverr_pre = psel;    //decode error
           default : pslverr_pre = psel;    //decode error
          endcase
          endcase
     end
     end
 
 
 
 
        //---------------------- Sample outputs -----------------------------
        //---------------------- Sample outputs -----------------------------
   always @(posedge clk or posedge reset)
   always @(posedge clk or posedge reset)
     if (reset)
     if (reset)
       prdata <= #FFD {32{1'b0}};
       prdata <= #FFD {32{1'b0}};
     else if (gpread & pclken)
     else if (gpread & pclken)
       prdata <= #FFD prdata_pre;
       prdata <= #FFD prdata_pre;
     else if (pclken)
     else if (pclken)
       prdata <= #FFD {32{1'b0}};
       prdata <= #FFD {32{1'b0}};
 
 
   always @(posedge clk or posedge reset)
   always @(posedge clk or posedge reset)
     if (reset)
     if (reset)
          begin
          begin
       pslverr <= #FFD 1'b0;
       pslverr <= #FFD 1'b0;
       pready <= #FFD 1'b0;
       pready <= #FFD 1'b0;
          end
          end
     else if ((gpread | gpwrite) & pclken)
     else if ((gpread | gpwrite) & pclken)
          begin
          begin
       pslverr <= #FFD pslverr_pre;
       pslverr <= #FFD pslverr_pre;
       pready <= #FFD 1'b1;
       pready <= #FFD 1'b1;
          end
          end
     else if (pclken)
     else if (pclken)
          begin
          begin
       pslverr <= #FFD 1'b0;
       pslverr <= #FFD 1'b0;
       pready <= #FFD 1'b0;
       pready <= #FFD 1'b0;
          end
          end
 
 
 
 
endmodule
endmodule
 
 
 
 
 
 

powered by: WebSVN 2.1.0

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