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

Subversion Repositories or1k

[/] [or1k/] [branches/] [mp3_stable/] [or1200/] [rtl/] [verilog/] [rf.v] - Diff between revs 166 and 168

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

Rev 166 Rev 168
Line 42... Line 42...
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
//
// CVS Revision History
// CVS Revision History
//
//
// $Log: not supported by cvs2svn $
// $Log: not supported by cvs2svn $
 
// Revision 1.2  2001/07/22 03:31:54  lampret
 
// Fixed RAM's oen bug. Cache bypass under development.
 
//
// Revision 1.1  2001/07/20 00:46:21  lampret
// Revision 1.1  2001/07/20 00:46:21  lampret
// Development version of RTL. Libraries are missing.
// Development version of RTL. Libraries are missing.
//
//
//
//
 
 
`include "general.h"
`include "timescale.v"
 
`include "defines.v"
 
 
 
module rf(
 
        // Clock and reset
 
        clk, rst,
 
 
//`define XCV_RF
        // Write i/f
`define ART_DP
        addrw, dataw, we,
 
 
module rf(clk, rst, addrw, dataw, pipeline_freeze, we, addra, dataa, addrb, datab,
        // Read i/f
        rfa_tqa, rfb_tqa, rfa_tmuxed, rfb_tmuxed, tp1w, tpdw
        pipeline_freeze, addra, addrb, dataa, datab,
 
 
 
        // Debug
 
        rfa_tqa, rfb_tqa, rfa_tmuxed, rfb_tmuxed, tp1w
);
);
 
 
parameter dw = `OPERAND_WIDTH;
parameter dw = `OPERAND_WIDTH;
parameter aw = `REGFILE_ADDR_WIDTH;
parameter aw = `REGFILE_ADDR_WIDTH;
 
 
input clk, rst, pipeline_freeze, we;
//
 
// I/O
 
//
 
 
input [dw-1:0] dataw;
//
output [dw-1:0] dataa;
// Clock and reset
output [dw-1:0] datab;
//
 
input                           clk;
 
input                           rst;
 
 
 
//
 
// Write i/f
 
//
input [aw-1:0] addrw;
input [aw-1:0] addrw;
 
input   [dw-1:0]         dataw;
 
input                           we;
 
 
 
//
 
// Read i/f
 
//
 
input                           pipeline_freeze;
input [aw-1:0] addra;
input [aw-1:0] addra;
input [aw-1:0] addrb;
input [aw-1:0] addrb;
 
output  [dw-1:0]         dataa;
 
output  [dw-1:0]         datab;
 
 
// Trace port
//
 
// Debug
 
//
output [31:0] rfa_tqa;
output [31:0] rfa_tqa;
output [31:0] rfb_tqa;
output [31:0] rfb_tqa;
output [`TP1R_WIDTH-1:0] rfa_tmuxed;
output [`TP1R_WIDTH-1:0] rfa_tmuxed;
output [`TP1R_WIDTH-1:0] rfb_tmuxed;
output [`TP1R_WIDTH-1:0] rfb_tmuxed;
input [`TP1W_WIDTH-1:0] tp1w;
input [`TP1W_WIDTH-1:0] tp1w;
input [31:0] tpdw;
 
 
 
wire [dw-1:0] from_rfa, from_rfb;
 
 
 
 
//
 
// Internal wires and regs
 
//
 
wire    [dw-1:0]         from_rfa;
 
wire    [dw-1:0]         from_rfb;
wire [dw-1:0] t_dataw; // for test port
wire [dw-1:0] t_dataw; // for test port
wire [aw-1:0] t_addrw; // for test port
wire [aw-1:0] t_addrw; // for test port
wire [aw-1:0] t_addra; // for test port
wire [aw-1:0] t_addra; // for test port
wire [aw-1:0] t_addrb; // for test port
wire [aw-1:0] t_addrb; // for test port
 
reg     [dw:0]                   dataa_saved;
 
reg     [dw:0]                   datab_saved;
 
 
reg [dw:0] dataa_saved, datab_saved;
//
 
// Simple assignments
 
//
 
assign rfa_tqa = 32'b0;
 
assign rfb_tqa = 32'b0;
 
assign rfa_tmuxed = `TP1R_WIDTH'b0;
 
assign rfb_tmuxed = `TP1R_WIDTH'b0;
 
 
 
//
 
// Operand A comes from RF or from saved A register
 
//
assign dataa = (dataa_saved[32]) ? dataa_saved[31:0] : from_rfa;
assign dataa = (dataa_saved[32]) ? dataa_saved[31:0] : from_rfa;
 
 
 
//
 
// Operand B comes from RF or from saved B register
 
//
assign datab = (datab_saved[32]) ? datab_saved[31:0] : from_rfb;
assign datab = (datab_saved[32]) ? datab_saved[31:0] : from_rfb;
 
 
 
//
// Stores operand from RF_A into temp reg when pipeline is frozen
// Stores operand from RF_A into temp reg when pipeline is frozen
 
//
always @(posedge clk or posedge rst)
always @(posedge clk or posedge rst)
        if (rst) begin
        if (rst) begin
                dataa_saved <= #1 33'b0;
                dataa_saved <= #1 33'b0;
        end
        end
        else if (pipeline_freeze & !dataa_saved[32]) begin
        else if (pipeline_freeze & !dataa_saved[32]) begin
                dataa_saved <= #1 {1'b1, from_rfa};
                dataa_saved <= #1 {1'b1, from_rfa};
        end
        end
        else if (!pipeline_freeze)
        else if (!pipeline_freeze)
                dataa_saved[32] <= #1 1'b0;
                dataa_saved[32] <= #1 1'b0;
 
 
 
//
// Stores operand from RF_B into temp reg when pipeline is frozen
// Stores operand from RF_B into temp reg when pipeline is frozen
 
//
always @(posedge clk or posedge rst)
always @(posedge clk or posedge rst)
        if (rst) begin
        if (rst) begin
                datab_saved <= #1 33'b0;
                datab_saved <= #1 33'b0;
        end
        end
        else if (pipeline_freeze & !datab_saved[32]) begin
        else if (pipeline_freeze & !datab_saved[32]) begin
                datab_saved <= #1 {1'b1, from_rfb};
                datab_saved <= #1 {1'b1, from_rfb};
        end
        end
        else if (!pipeline_freeze)
        else if (!pipeline_freeze)
                datab_saved[32] <= #1 1'b0;
                datab_saved[32] <= #1 1'b0;
 
 
`ifdef XCV_RF
//
// Instantiation of register file memory (A)
// Instantiation of register file dual-port RAM A
xcv_rfram rf(
//
        .clk(clk),
generic_dpram_32x32 rf_a(
        .rst(rst),
        // Port A
        .we(we),
        .clk_a(clk),
        .addrw(addrw),
        .rst_a(rst),
        .dataw(dataw),
        .ce_a(1'b1),
        .addra(addra),
        .oe_a(1'b1),
        .dataa(from_rfa),
        .addr_a(addra),
        .addrb(addrb),
        .do_a(from_rfa),
        .datab(from_rfb)
 
);
        // Port B
 
        .clk_b(clk),
`else
        .rst_b(rst),
 
        .ce_b(we),
`ifdef ART_DP
        .we_b(we),
// Instatiation of dual port high density artisan sram memory
        .addr_b(addrw),
art_hsdp_32x32 rf_a(
        .di_b(dataw)
   .qa(from_rfa),
 
   .clka(clk),
 
   .cena(1'b0),
 
   .wena(1'b1),
 
   .aa(addra),
 
   .da(32'b0),
 
   .oena(1'b0),
 
   .qb(),
 
   .clkb(clk),
 
   .cenb(~we),
 
   .wenb(1'b0),
 
   .ab(addrw),
 
   .db(dataw),
 
   .oenb(1'b1)
 
);
 
 
 
art_hsdp_32x32 rf_b(
 
   .qa(from_rfb),
 
   .clka(clk),
 
   .cena(1'b0),
 
   .wena(1'b1),
 
   .aa(addrb),
 
   .da(32'b0),
 
   .oena(1'b0),
 
   .qb(),
 
   .clkb(clk),
 
   .cenb(~we),
 
   .wenb(1'b0),
 
   .ab(addrw),
 
   .db(dataw),
 
   .oenb(1'b1)
 
);
 
 
 
assign rfa_tqa = 32'b0;
 
assign rfb_tqa = 32'b0;
 
assign rfa_tmuxed = `TP1R_WIDTH'b0;
 
assign rfb_tmuxed = `TP1R_WIDTH'b0;
 
 
 
`else
 
 
 
// Instantiation of register file memory (A)
 
art_rf2r_32x32 rf_a(
 
        .QA(from_rfa),
 
 
 
        .OENSQA(rfa_tmuxed[`TP1R_RF_OENSQA]),
 
        .ASQA(rfa_tmuxed[`TP1R_RF_ASQA]),
 
        .TQA(rfa_tqa),
 
        .QSQA(rfa_tmuxed[`TP1R_RF_QSQA]),
 
        .DSOB(rfa_tmuxed[`TP1R_RF_DSOB]),
 
        .CENSQB(rfa_tmuxed[`TP1R_RF_CENSQB]),
 
        .ASQB(rfa_tmuxed[`TP1R_RF_ASQB]),
 
 
 
        .CLKA(clk),
 
        .CENA(1'b0),
 
        .OENA(1'b0),
 
        .AA(addra),
 
        .TISA(tp1w[`TP1W_RF_TISA]),
 
        .TMSA(tp1w[`TP1W_RF_TMSA]),
 
        .TCENA(tp1w[`TP1W_RF_TCENA]),
 
        .TOENA(tp1w[`TP1W_RF_TOENA]),
 
        .TQOENA(tp1w[`TP1W_RF_TQOENA]),
 
        .TAA(tp1w[`TP1W_RF_TAA]),
 
        .CLKB(clk),
 
        .CENB(~we),
 
        .AB(addrw),
 
        .DB(dataw),
 
        .TISB(tp1w[`TP1W_RF_TISB]),
 
        .TMSB(tp1w[`TP1W_RF_TMSB]),
 
        .TCENB(tp1w[`TP1W_RF_TCENB]),
 
        .TAB(tp1w[`TP1W_RF_TAB]),
 
        .TDB(tpdw),
 
        .SMSB(tp1w[`TP1W_RF_SMSB]),
 
        .DSIB(tp1w[`TP1W_RF_DSIB])
 
);
);
 
 
// Instantiation of register file memory (B)
//
art_rf2r_32x32 rf_b(
// Instantiation of register file dual-port RAM B
        .QA(from_rfb),
//
 
generic_dpram_32x32 rf_b(
        .OENSQA(rfb_tmuxed[`TP1R_RF_OENSQA]),
        // Port A
        .ASQA(rfb_tmuxed[`TP1R_RF_ASQA]),
        .clk_a(clk),
        .TQA(rfb_tqa),
        .rst_a(rst),
        .QSQA(rfb_tmuxed[`TP1R_RF_QSQA]),
        .ce_a(1'b1),
        .DSOB(rfb_tmuxed[`TP1R_RF_DSOB]),
        .oe_a(1'b1),
        .CENSQB(rfb_tmuxed[`TP1R_RF_CENSQB]),
        .addr_a(addrb),
        .ASQB(rfb_tmuxed[`TP1R_RF_ASQB]),
        .do_a(from_rfb),
 
 
        .CLKA(clk),
        // Port B
        .CENA(1'b0),
        .clk_b(clk),
        .OENA(1'b0),
        .rst_b(rst),
        .AA(addrb),
        .ce_b(we),
        .TISA(tp1w[`TP1W_RF_TISA]),
        .we_b(we),
        .TMSA(tp1w[`TP1W_RF_TMSA]),
        .addr_b(addrw),
        .TCENA(tp1w[`TP1W_RF_TCENA]),
        .di_b(dataw)
        .TOENA(tp1w[`TP1W_RF_TOENA]),
 
        .TQOENA(tp1w[`TP1W_RF_TQOENA]),
 
        .TAA(tp1w[`TP1W_RF_TAA]),
 
        .CLKB(clk),
 
        .CENB(~we),
 
        .AB(addrw),
 
        .DB(dataw),
 
        .TISB(tp1w[`TP1W_RF_TISB]),
 
        .TMSB(tp1w[`TP1W_RF_TMSB]),
 
        .TCENB(tp1w[`TP1W_RF_TCENB]),
 
        .TAB(tp1w[`TP1W_RF_TAB]),
 
        .TDB(tpdw),
 
        .SMSB(tp1w[`TP1W_RF_SMSB]),
 
        .DSIB(tp1w[`TP1W_RF_DSIB])
 
);
);
`endif
 
`endif
 
/*
 
art_rf2r_32x32 rf_a(
 
        .qa(from_rfa),
 
 
 
        .oensqa(rfa_tmuxed[`TP1R_RF_OENSQA]),
 
        .asqa(rfa_tmuxed[`TP1R_RF_ASQA]),
 
        .tqa(rfa_tqa),
 
        .qsqa(rfa_tmuxed[`TP1R_RF_QSQA]),
 
        .dsob(rfa_tmuxed[`TP1R_RF_DSOB]),
 
        .censqb(rfa_tmuxed[`TP1R_RF_CENSQB]),
 
        .asqb(rfa_tmuxed[`TP1R_RF_ASQB]),
 
 
 
        .clka(clk),
 
        .cena(1'b0),
 
        .oena(1'b0),
 
        .aa(addra),
 
        .tisa(tp1w[`TP1W_RF_TISA]),
 
        .tmsa(tp1w[`TP1W_RF_TMSA]),
 
        .tcena(tp1w[`TP1W_RF_TCENA]),
 
        .toena(tp1w[`TP1W_RF_TOENA]),
 
        .tqoena(tp1w[`TP1W_RF_TQOENA]),
 
        .taa(tp1w[`TP1W_RF_TAA]),
 
        .clkb(clk),
 
        .cenb(~we),
 
        .ab(addrw),
 
        .db(dataw),
 
        .tisb(tp1w[`TP1W_RF_TISB]),
 
        .tmsb(tp1w[`TP1W_RF_TMSB]),
 
        .tcenb(tp1w[`TP1W_RF_TCENB]),
 
        .tab(tp1w[`TP1W_RF_TAB]),
 
        .tdb(tpdw),
 
        .smsb(tp1w[`TP1W_RF_SMSB]),
 
        .dsib(tp1w[`TP1W_RF_DSIB])
 
);
 
 
 
// Instantiation of register file memory (B)
 
art_rf2r_32x32 rf_b(
 
        .qa(from_rfb),
 
 
 
        .oensqa(rfb_tmuxed[`TP1R_RF_OENSQA]),
 
        .asqa(rfb_tmuxed[`TP1R_RF_ASQA]),
 
        .tqa(rfb_tqa),
 
        .qsqa(rfb_tmuxed[`TP1R_RF_QSQA]),
 
        .dsob(rfb_tmuxed[`TP1R_RF_DSOB]),
 
        .censqb(rfb_tmuxed[`TP1R_RF_CENSQB]),
 
        .asqb(rfb_tmuxed[`TP1R_RF_ASQB]),
 
 
 
        .clka(clk),
 
        .cena(1'b0),
 
        .oena(1'b0),
 
        .aa(addrb),
 
        .tisa(tp1w[`TP1W_RF_TISA]),
 
        .tmsa(tp1w[`TP1W_RF_TMSA]),
 
        .tcena(tp1w[`TP1W_RF_TCENA]),
 
        .toena(tp1w[`TP1W_RF_TOENA]),
 
        .tqoena(tp1w[`TP1W_RF_TQOENA]),
 
        .taa(tp1w[`TP1W_RF_TAA]),
 
        .clkb(clk),
 
        .cenb(~we),
 
        .ab(addrw),
 
        .db(dataw),
 
        .tisb(tp1w[`TP1W_RF_TISB]),
 
        .tmsb(tp1w[`TP1W_RF_TMSB]),
 
        .tcenb(tp1w[`TP1W_RF_TCENB]),
 
        .tab(tp1w[`TP1W_RF_TAB]),
 
        .tdb(tpdw),
 
        .smsb(tp1w[`TP1W_RF_SMSB]),
 
        .dsib(tp1w[`TP1W_RF_DSIB])
 
);
 
*/
 
 
 
endmodule
endmodule
 
 
 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.