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
|