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

Subversion Repositories aemb

[/] [aemb/] [trunk/] [rtl/] [verilog/] [aeMB2_dwbif.v] - Diff between revs 191 and 202

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 191 Rev 202
Line 28... Line 28...
 */
 */
 
 
module aeMB2_dwbif (/*AUTOARG*/
module aeMB2_dwbif (/*AUTOARG*/
   // Outputs
   // Outputs
   dwb_adr_o, dwb_sel_o, dwb_stb_o, dwb_cyc_o, dwb_tag_o, dwb_wre_o,
   dwb_adr_o, dwb_sel_o, dwb_stb_o, dwb_cyc_o, dwb_tag_o, dwb_wre_o,
   dwb_dat_o, dwb_fb, sel_mx, dwb_mx,
   dwb_dat_o, dwb_fb, sel_mx, dwb_mx, exc_dwb,
   // Inputs
   // Inputs
   dwb_dat_i, dwb_ack_i, imm_of, opd_of, opc_of, opa_of, opb_of,
   dwb_dat_i, dwb_ack_i, dwb_err_i, imm_of, opd_of, opc_of, opa_of,
   msr_ex, mem_ex, sfr_mx, gclk, grst, dena, gpha
   opb_of, msr_ex, mem_ex, sfr_mx, gclk, grst, dena, gpha
   );
   );
   parameter AEMB_DWB = 32; ///< data bus address width   
   parameter AEMB_DWB = 32; ///< data bus address width   
 
 
   // DWB control signals
   // DWB control signals
   output [AEMB_DWB-1:2] dwb_adr_o;
   output [AEMB_DWB-1:2] dwb_adr_o;
Line 45... Line 45...
                         dwb_tag_o, // cache enable
                         dwb_tag_o, // cache enable
                         dwb_wre_o;
                         dwb_wre_o;
   output [31:0]          dwb_dat_o;
   output [31:0]          dwb_dat_o;
   input [31:0]   dwb_dat_i;
   input [31:0]   dwb_dat_i;
   input                 dwb_ack_i;
   input                 dwb_ack_i;
 
   input                 dwb_err_i; // for bus error exception
 
 
   // INTERNAL
   // INTERNAL
   output                dwb_fb;
   output                dwb_fb;
   output [3:0]   sel_mx;
   output [3:0]   sel_mx;
   output [31:0]          dwb_mx;
   output [31:0]          dwb_mx;
Line 59... Line 60...
   input [1:0]            opb_of;
   input [1:0]            opb_of;
   input [7:0]            msr_ex;
   input [7:0]            msr_ex;
   input [AEMB_DWB-1:2]  mem_ex;
   input [AEMB_DWB-1:2]  mem_ex;
   input [7:5]           sfr_mx;
   input [7:5]           sfr_mx;
 
 
 
   // EXC signals
 
   output [1:0]   exc_dwb; // 1: unaligned; 0: bus error
 
 
   // SYS signals
   // SYS signals
   input                 gclk,
   input                 gclk,
                         grst,
                         grst,
                         dena,
                         dena,
                         gpha;
                         gpha;
 
 
   /*AUTOREG*/
   /*AUTOREG*/
   // Beginning of automatic regs (for this module's undeclared outputs)
 
   reg                  dwb_cyc_o;
 
   reg [31:0]            dwb_dat_o;
 
   reg [31:0]            dwb_mx;
 
   reg [3:0]             dwb_sel_o;
   reg [3:0]             dwb_sel_o;
   reg                  dwb_stb_o;
   reg                   dwb_stb_o, dwb_cyc_o, dwb_wre_o;
   reg                  dwb_wre_o;
   reg [31:0]             dwb_dat_o;
   reg [3:0]             sel_mx;
   reg [3:0]             sel_mx;
   // End of automatics
   reg [31:0]             dwb_mx;
 
   reg                   dwb_exc;
 
 
   wire [1:0]            wOFF = (opa_of[1:0] + opb_of[1:0]); // small adder   
   wire [1:0]            wOFF = (opa_of[1:0] + opb_of[1:0]); // small adder   
   wire [3:0]            wSEL = {opc_of[1:0], wOFF};
   wire [3:0]            wSEL = {opc_of[1:0], wOFF}; // byte selector info
 
 
   // ENABLE FEEDBACK
 
   assign               dwb_fb = (dwb_stb_o ~^ dwb_ack_i);
 
 
 
   // DATA bus
   assign               dwb_fb = (dwb_stb_o ~^ dwb_ack_i); // feedback
   assign               dwb_adr_o = mem_ex; // passthru
   assign               dwb_adr_o = mem_ex; // data-bus passthru
 
   assign               exc_dwb = {dwb_exc, dwb_err_i}; // exception signal
 
 
   // STORE SIZER
   // STORE SIZER
   // TODO: Move the right words to the right place
   // TODO: Move the right words to the right place
   // TODO: Make this work with dwb_mx to for partial word loads.
   // TODO: Make this work with dwb_mx to for partial word loads.
 
 
Line 113... Line 112...
   // WISHBONE PIPELINE
   // WISHBONE PIPELINE
   always @(posedge gclk)
   always @(posedge gclk)
     if (grst) begin
     if (grst) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
 
        dwb_exc <= 1'h0;
        dwb_mx <= 32'h0;
        dwb_mx <= 32'h0;
        dwb_sel_o <= 4'h0;
        dwb_sel_o <= 4'h0;
        dwb_wre_o <= 1'h0;
        dwb_wre_o <= 1'h0;
        sel_mx <= 4'h0;
        sel_mx <= 4'h0;
        // End of automatics
        // End of automatics
Line 149... Line 149...
          4'hC, 4'hD, 4'hE, 4'hF:
          4'hC, 4'hD, 4'hE, 4'hF:
            dwb_sel_o <= #1 4'h0;
            dwb_sel_o <= #1 4'h0;
          // TODO: ILLEGAL
          // TODO: ILLEGAL
          default: dwb_sel_o <= #1 4'hX;
          default: dwb_sel_o <= #1 4'hX;
        endcase // case (wSEL)
        endcase // case (wSEL)
 
 
 
        // exception checking
 
        case (opc_of[1:0])
 
          2'o2: dwb_exc <= #1 |wOFF[1:0];
 
          2'o1: dwb_exc <= #1 wOFF[0];
 
          default: dwb_exc <= #1 1'b0;
 
        endcase // case (opc_of[1:0])
 
 
     end // if (dena)
     end // if (dena)
 
 
   // Independent on pipeline
   // Independent of pipeline
 
 
   always @(posedge gclk)
   always @(posedge gclk)
     if (grst) begin
     if (grst) begin
        /*AUTORESET*/
        /*AUTORESET*/
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        dwb_lat <= 32'h0;
        dwb_lat <= 32'h0;
        // End of automatics
        // End of automatics
     end else if (dwb_ack_i) begin
     end else if (dwb_ack_i) begin // if (grst)
        // LATCH READS
        // LATCH READS
        dwb_lat <= #1 dwb_dat_i;
        dwb_lat <= #1 dwb_dat_i;
     end
     end
 
 
   always @(posedge gclk)
   always @(posedge gclk)
Line 172... Line 180...
        // Beginning of autoreset for uninitialized flops
        // Beginning of autoreset for uninitialized flops
        dwb_cyc_o <= 1'h0;
        dwb_cyc_o <= 1'h0;
        dwb_stb_o <= 1'h0;
        dwb_stb_o <= 1'h0;
        // End of automatics
        // End of automatics
     //end else if (dwb_fb) begin
     //end else if (dwb_fb) begin
     end else if (dwb_fb) begin
     end else if (dwb_fb) begin // if (grst)
        dwb_stb_o <= #1
        dwb_stb_o <= #1
                     (dena) ? &opc_of[5:4] : // LXX/SSS
                     (dena) ? &opc_of[5:4] : // LXX/SSS
                     (dwb_stb_o & !dwb_ack_i); // LXX/SSS
                     (dwb_stb_o & !dwb_ack_i); // LXX/SSS
        dwb_cyc_o <= #1
        dwb_cyc_o <= #1
                     (dena) ? &opc_of[5:4] | msr_ex[0] :
                     (dena) ? &opc_of[5:4] | msr_ex[0] :
                     (dwb_stb_o & !dwb_ack_i) | msr_ex[0];
                     (dwb_stb_o & !dwb_ack_i) | msr_ex[0];
     end
     end
 
 
   assign dwb_tag_o = msr_ex[7]; // MSR_DCE     
   assign dwb_tag_o = msr_ex[7]; // MSR_DCE     
 
 
endmodule // aeMB2_dwbif
endmodule // unmatched end(function|task|module|primitive|interface|package|class|clocking)
 
 
/*
 
 $Log: not supported by cvs2svn $
 
 Revision 1.6  2008/04/26 17:57:43  sybreon
 
 Minor performance improvements.
 
 
 
 Revision 1.5  2008/04/26 01:09:05  sybreon
 
 Passes basic tests. Minor documentation changes to make it compatible with iverilog pre-processor.
 
 
 
 Revision 1.4  2008/04/23 14:18:52  sybreon
 
 Fixed pipelined latching of data bug.
 
 
 
 Revision 1.3  2008/04/21 12:11:38  sybreon
 
 Passes arithmetic tests with single thread.
 
 
 
 Revision 1.2  2008/04/20 16:34:32  sybreon
 
 Basic version with some features left out.
 
 
 
 Revision 1.1  2008/04/18 00:21:52  sybreon
 
 Initial import.
 
*/
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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