Line 26... |
Line 26... |
// If a register field is not used by an instruction, then the register
|
// If a register field is not used by an instruction, then the register
|
// selected is forced to r0 for that field. This causes load stalls to be
|
// selected is forced to r0 for that field. This causes load stalls to be
|
// avoided, which would otherwise occur.
|
// avoided, which would otherwise occur.
|
//=============================================================================
|
//=============================================================================
|
|
|
module Raptor64_SetOperandRegs(rst, clk, advanceI, advanceR, advanceX, b, AXC, xAXC, insn, xIR, dRa, dRb, dRc);
|
module Raptor64_SetOperandRegs(rst, clk, advanceI, advanceR, advanceX, b, AXC, xAXC, insn, xIR, dRa, dRb, dRc, nxt_Ra, nxt_Rb, nxt_Rc);
|
input rst;
|
input rst;
|
input clk;
|
input clk;
|
input advanceI;
|
input advanceI;
|
input advanceR;
|
input advanceR;
|
input advanceX;
|
input advanceX;
|
Line 43... |
Line 43... |
reg [8:0] dRa;
|
reg [8:0] dRa;
|
output [8:0] dRb;
|
output [8:0] dRb;
|
reg [8:0] dRb;
|
reg [8:0] dRb;
|
output [8:0] dRc;
|
output [8:0] dRc;
|
reg [8:0] dRc;
|
reg [8:0] dRc;
|
|
output [8:0] nxt_Ra;
|
|
reg [8:0] nxt_Ra;
|
|
output [8:0] nxt_Rb;
|
|
reg [8:0] nxt_Rb;
|
|
output [8:0] nxt_Rc;
|
|
reg [8:0] nxt_Rc;
|
|
|
wire [6:0] iOpcode = insn[31:25];
|
wire [6:0] iOpcode = insn[31:25];
|
wire [6:0] xOpcode = xIR[31:25];
|
wire [6:0] xOpcode = xIR[31:25];
|
wire [5:0] xFunc = xIR[5:0];
|
wire [5:0] xFunc = xIR[5:0];
|
wire [6:0] iFunc7 = insn[6:0];
|
wire [6:0] iFunc7 = insn[6:0];
|
|
|
always @(posedge clk)
|
|
if (rst) begin
|
always @*
|
dRa <= 9'd0;
|
begin
|
dRb <= 9'd0;
|
nxt_Ra <= dRa;
|
dRc <= 9'd0;
|
nxt_Rb <= dRb;
|
end
|
nxt_Rc <= dRc;
|
else begin
|
|
if (advanceI) begin
|
if (advanceI) begin
|
// Default settings, to be overridden
|
// Default settings, to be overridden
|
dRa <= {AXC,insn[24:20]};
|
nxt_Ra <= {AXC,insn[24:20]};
|
dRb <= {AXC,insn[19:15]};
|
nxt_Rb <= {AXC,insn[19:15]};
|
dRc <= {AXC,insn[14:10]};
|
nxt_Rc <= {AXC,insn[14:10]};
|
casex(iOpcode)
|
casex(iOpcode)
|
`MISC:
|
`MISC:
|
case(iFunc7)
|
case(iFunc7)
|
`IRET: begin
|
`IRET: begin
|
dRa <= {AXC,5'd25};
|
nxt_Ra <= {AXC,5'd25};
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`ERET: begin
|
`ERET: begin
|
dRa <= {AXC,5'd24};
|
nxt_Ra <= {AXC,5'd24};
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
default:
|
default:
|
begin
|
begin
|
dRa <= 9'd0;
|
nxt_Ra <= 9'd0;
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
endcase
|
endcase
|
`R: begin dRb <= 9'd0; dRc <= 9'd0; end
|
`R: begin nxt_Rb <= 9'd0; nxt_Rc <= 9'd0; end
|
`RR: dRc <= 9'd0;
|
`RR: nxt_Rc <= 9'd0;
|
`TRAPcc: dRc <= 9'd0;
|
`TRAPcc: nxt_Rc <= 9'd0;
|
`TRAPcci: begin dRb <= 9'd0; dRc <= 9'd0; end
|
`TRAPcci: begin nxt_Rb <= 9'd0; nxt_Rc <= 9'd0; end
|
`CALL,`JMP,`NOPI:
|
`CALL,`JMP,`NOPI:
|
begin
|
begin
|
dRa <= 9'd0;
|
nxt_Ra <= 9'd0;
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`RET: begin
|
`RET: begin
|
dRa <= {AXC,5'd30};
|
nxt_Ra <= {AXC,5'd30};
|
dRb <= {AXC,5'd31};
|
nxt_Rb <= {AXC,5'd31};
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`LB,`LBU,`LH,`LHU,`LC,`LCU,`LW,`LP,`LSH,`LSW,`LF,`LFD,`LFP,`LFDP,`LWR:
|
`LB,`LBU,`LH,`LHU,`LC,`LCU,`LW,`LP,`LSH,`LSW,`LF,`LFD,`LFP,`LFDP,`LWR:
|
begin
|
begin
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`SB,`SC,`SH,`SW,`SP,`SSH,`SSW,`SF,`SFD,`SFP,`SFDP,`SWC:
|
`SB,`SC,`SH,`SW,`SP,`SSH,`SSW,`SF,`SFD,`SFP,`SFDP,`SWC:
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
`INB,`INBU,`INCH,`INCU,`INH,`INHU,`INW:
|
`INB,`INBU,`INCH,`INCU,`INH,`INHU,`INW:
|
begin
|
begin
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`OUTB,`OUTC,`OUTH,`OUTW:
|
`OUTB,`OUTC,`OUTH,`OUTW:
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
`BLTI,`BLEI,`BGTI,`BGEI,
|
`BLTI,`BLEI,`BGTI,`BGEI,
|
`BLTUI,`BLEUI,`BGTUI,`BGEUI,
|
`BLTUI,`BLEUI,`BGTUI,`BGEUI,
|
`BEQI,`BNEI:
|
`BEQI,`BNEI:
|
begin
|
begin
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`BTRI: dRc <= 9'd0;
|
`BTRI: nxt_Rc <= 9'd0;
|
`SLTI,`SLEI,`SGTI,`SGEI,
|
`SLTI,`SLEI,`SGTI,`SGEI,
|
`SLTUI,`SLEUI,`SGTUI,`SGEUI,
|
`SLTUI,`SLEUI,`SGTUI,`SGEUI,
|
`SEQI,`SNEI:
|
`SEQI,`SNEI:
|
begin
|
begin
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`ADDI,`ADDUI,`SUBI,`SUBUI,`CMPI,`CMPUI,
|
`ADDI,`ADDUI,`SUBI,`SUBUI,`CMPI,`CMPUI,
|
`ANDI,`XORI,`ORI,`MULUI,`MULSI,`DIVUI,`DIVSI:
|
`ANDI,`XORI,`ORI,`MULUI,`MULSI,`DIVUI,`DIVSI:
|
begin
|
begin
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`JAL:
|
`JAL:
|
begin
|
begin
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
`SETLO: begin dRa <= {AXC,insn[26:22]}; dRb <= 9'd0; dRc <= 9'd0; end
|
`SETLO: begin nxt_Ra <= {AXC,insn[26:22]}; nxt_Rb <= 9'd0; nxt_Rc <= 9'd0; end
|
`SETMID: begin dRa <= {AXC,insn[26:22]}; dRb <= 9'd0; dRc <= 9'd0; end
|
`SETMID: begin nxt_Ra <= {AXC,insn[26:22]}; nxt_Rb <= 9'd0; nxt_Rc <= 9'd0; end
|
`SETHI: begin dRa <= {AXC,insn[26:22]}; dRb <= 9'd0; dRc <= 9'd0; end
|
`SETHI: begin nxt_Ra <= {AXC,insn[26:22]}; nxt_Rb <= 9'd0; nxt_Rc <= 9'd0; end
|
default: dRa <= {AXC,insn[24:20]};
|
default: nxt_Ra <= {AXC,insn[24:20]};
|
endcase
|
endcase
|
end
|
end
|
else if (advanceR) begin
|
else if (advanceR) begin
|
dRa <= 9'd0;
|
nxt_Ra <= 9'd0;
|
dRb <= 9'd0;
|
nxt_Rb <= 9'd0;
|
dRc <= 9'd0;
|
nxt_Rc <= 9'd0;
|
end
|
end
|
// no else here
|
// no else here
|
if (advanceX) begin
|
if (advanceX) begin
|
if (xOpcode==`R) begin
|
if (xOpcode==`R) begin
|
if (xFunc==`EXEC) begin
|
if (xFunc==`EXEC) begin
|
dRa <= {xAXC,b[24:20]};
|
nxt_Ra <= {xAXC,b[24:20]};
|
dRb <= {xAXC,b[19:15]};
|
nxt_Rb <= {xAXC,b[19:15]};
|
dRc <= {xAXC,b[14:10]};
|
nxt_Rc <= {xAXC,b[14:10]};
|
|
end
|
end
|
end
|
end
|
end
|
end
|
end
|
|
|
|
always @(posedge clk)
|
|
if (rst) begin
|
|
dRa <= 9'd0;
|
|
dRb <= 9'd0;
|
|
dRc <= 9'd0;
|
|
end
|
|
else begin
|
|
dRa <= nxt_Ra;
|
|
dRb <= nxt_Rb;
|
|
dRc <= nxt_Rc;
|
end
|
end
|
|
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|