Yeet Zcb into core
This commit is contained in:
parent
a247c5cfc1
commit
78d937e5c8
|
@ -11,6 +11,7 @@ Hazard3 is a 3-stage RISC-V processor, implementing the `RV32I` instruction set
|
||||||
* `Zbc`: carry-less multiplication
|
* `Zbc`: carry-less multiplication
|
||||||
* `Zbs`: single-bit manipulation
|
* `Zbs`: single-bit manipulation
|
||||||
* `Zbkb`: basic bit manipulation for scalar cryptography
|
* `Zbkb`: basic bit manipulation for scalar cryptography
|
||||||
|
* `Zcb`: basic additional compressed instructions *(experimental)*
|
||||||
* Debug, Machine and User privilege/execution modes
|
* Debug, Machine and User privilege/execution modes
|
||||||
* Privileged instructions `ECALL`, `EBREAK`, `MRET` and `WFI`
|
* Privileged instructions `ECALL`, `EBREAK`, `MRET` and `WFI`
|
||||||
* Physical memory protection (PMP) with up to 16 naturally aligned regions
|
* Physical memory protection (PMP) with up to 16 naturally aligned regions
|
||||||
|
|
|
@ -105,6 +105,17 @@ Requires: <<param-EXTENSION_ZBB>>. (Since Zbb and Zbkb have a large overlap, thi
|
||||||
|
|
||||||
Default value: 0
|
Default value: 0
|
||||||
|
|
||||||
|
[[param-EXTENSION_ZCB]]
|
||||||
|
===== EXTENSION_ZCB:
|
||||||
|
|
||||||
|
Support for Zcb basic additional compressed instructions
|
||||||
|
|
||||||
|
Requires: <<param-EXTENSION_C>>. (Some Zcb instructions also require Zbb or M, as they are 16-bit aliases of 32-bit instructions present in those extensions.)
|
||||||
|
|
||||||
|
Note Zca is equivalent to C, as we do not support the F extension.
|
||||||
|
|
||||||
|
Default value: 0
|
||||||
|
|
||||||
[[param-EXTENSION_ZIFENCEI]]
|
[[param-EXTENSION_ZIFENCEI]]
|
||||||
===== EXTENSION_ZIFENCEI
|
===== EXTENSION_ZIFENCEI
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,11 @@ parameter EXTENSION_ZBS = 0,
|
||||||
// Requires: Zbb. (This flag enables instructions in Zbkb which aren't in Zbb.)
|
// Requires: Zbb. (This flag enables instructions in Zbkb which aren't in Zbb.)
|
||||||
parameter EXTENSION_ZBKB = 0,
|
parameter EXTENSION_ZBKB = 0,
|
||||||
|
|
||||||
|
// EXTENSION_ZCB: Support for ZCB basic additional compressed instructions
|
||||||
|
// Requires: C. (Some Zcb instructions also require Zbb or M.)
|
||||||
|
// Note Zca is equivalent to C, as we do not support the F extension.
|
||||||
|
parameter EXTENSION_ZCB = 0,
|
||||||
|
|
||||||
// EXTENSION_ZIFENCEI: Support for the fence.i instruction
|
// EXTENSION_ZIFENCEI: Support for the fence.i instruction
|
||||||
// Optional, since a plain branch/jump will also flush the prefetch queue.
|
// Optional, since a plain branch/jump will also flush the prefetch queue.
|
||||||
parameter EXTENSION_ZIFENCEI = 0,
|
parameter EXTENSION_ZIFENCEI = 0,
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
.EXTENSION_ZBC (EXTENSION_ZBC),
|
.EXTENSION_ZBC (EXTENSION_ZBC),
|
||||||
.EXTENSION_ZBS (EXTENSION_ZBS),
|
.EXTENSION_ZBS (EXTENSION_ZBS),
|
||||||
.EXTENSION_ZBKB (EXTENSION_ZBKB),
|
.EXTENSION_ZBKB (EXTENSION_ZBKB),
|
||||||
|
.EXTENSION_ZCB (EXTENSION_ZCB),
|
||||||
.EXTENSION_ZIFENCEI (EXTENSION_ZIFENCEI),
|
.EXTENSION_ZIFENCEI (EXTENSION_ZIFENCEI),
|
||||||
.EXTENSION_XH3BEXTM (EXTENSION_XH3BEXTM),
|
.EXTENSION_XH3BEXTM (EXTENSION_XH3BEXTM),
|
||||||
.EXTENSION_XH3IRQ (EXTENSION_XH3IRQ),
|
.EXTENSION_XH3IRQ (EXTENSION_XH3IRQ),
|
||||||
|
|
|
@ -76,7 +76,7 @@ reg d_invalid_32bit;
|
||||||
wire d_invalid = d_invalid_16bit || d_invalid_32bit;
|
wire d_invalid = d_invalid_16bit || d_invalid_32bit;
|
||||||
|
|
||||||
hazard3_instr_decompress #(
|
hazard3_instr_decompress #(
|
||||||
.PASSTHROUGH(!EXTENSION_C)
|
`include "hazard3_config_inst.vh"
|
||||||
) decomp (
|
) decomp (
|
||||||
.instr_in (fd_cir),
|
.instr_in (fd_cir),
|
||||||
.instr_is_32bit (d_instr_is_32bit),
|
.instr_is_32bit (d_instr_is_32bit),
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
`default_nettype none
|
`default_nettype none
|
||||||
|
|
||||||
module hazard3_instr_decompress #(
|
module hazard3_instr_decompress #(
|
||||||
parameter PASSTHROUGH = 0
|
`include "hazard3_config.vh"
|
||||||
) (
|
) (
|
||||||
input wire [31:0] instr_in,
|
input wire [31:0] instr_in,
|
||||||
output reg instr_is_32bit,
|
output reg instr_is_32bit,
|
||||||
|
@ -17,6 +17,7 @@ module hazard3_instr_decompress #(
|
||||||
`include "rv_opcodes.vh"
|
`include "rv_opcodes.vh"
|
||||||
|
|
||||||
localparam W_REGADDR = 5;
|
localparam W_REGADDR = 5;
|
||||||
|
localparam PASSTHROUGH = ~|EXTENSION_C;
|
||||||
|
|
||||||
// Long-register formats: cr, ci, css
|
// Long-register formats: cr, ci, css
|
||||||
// Short-register formats: ciw, cl, cs, cb, cj
|
// Short-register formats: ciw, cl, cs, cb, cj
|
||||||
|
@ -60,6 +61,20 @@ wire [31:0] imm_cb ={
|
||||||
7'h00
|
7'h00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
wire [31:0] imm_c_lb = {
|
||||||
|
10'h0,
|
||||||
|
instr_in[5],
|
||||||
|
instr_in[6],
|
||||||
|
20'h00000
|
||||||
|
};
|
||||||
|
|
||||||
|
wire [31:0] imm_c_lh = {
|
||||||
|
10'h000,
|
||||||
|
instr_in[5],
|
||||||
|
1'b0,
|
||||||
|
20'h00000
|
||||||
|
};
|
||||||
|
|
||||||
function [31:0] rfmt_rd; input [4:0] rd; begin rfmt_rd = {20'h00000, rd, 7'h00}; end endfunction
|
function [31:0] rfmt_rd; input [4:0] rd; begin rfmt_rd = {20'h00000, rd, 7'h00}; end endfunction
|
||||||
function [31:0] rfmt_rs1; input [4:0] rs1; begin rfmt_rs1 = {12'h000, rs1, 15'h0000}; end endfunction
|
function [31:0] rfmt_rs1; input [4:0] rs1; begin rfmt_rs1 = {12'h000, rs1, 15'h0000}; end endfunction
|
||||||
function [31:0] rfmt_rs2; input [4:0] rs2; begin rfmt_rs2 = {7'h00, rs2, 20'h00000}; end endfunction
|
function [31:0] rfmt_rs2; input [4:0] rs2; begin rfmt_rs2 = {7'h00, rs2, 20'h00000}; end endfunction
|
||||||
|
@ -137,6 +152,53 @@ end else begin: instr_decompress
|
||||||
| {4'h0, instr_in[8:7], instr_in[12], 13'h0000, instr_in[11:9], 2'b00, 7'h00};
|
| {4'h0, instr_in[8:7], instr_in[12], 13'h0000, instr_in[11:9], 2'b00, 7'h00};
|
||||||
`RVOPC_C_BEQZ: instr_out = `RVOPC_NOZ_BEQ | rfmt_rs1(rs1_s) | imm_cb;
|
`RVOPC_C_BEQZ: instr_out = `RVOPC_NOZ_BEQ | rfmt_rs1(rs1_s) | imm_cb;
|
||||||
`RVOPC_C_BNEZ: instr_out = `RVOPC_NOZ_BNE | rfmt_rs1(rs1_s) | imm_cb;
|
`RVOPC_C_BNEZ: instr_out = `RVOPC_NOZ_BNE | rfmt_rs1(rs1_s) | imm_cb;
|
||||||
|
|
||||||
|
// Optional Zbc instructions:
|
||||||
|
`RVOPC_C_LBU: begin
|
||||||
|
instr_out = `RVOPC_NOZ_LBU | rfmt_rd(rd_s) | rfmt_rs1(rs1_s) | imm_c_lb;
|
||||||
|
invalid = ~|EXTENSION_ZCB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_LHU: begin
|
||||||
|
instr_out = `RVOPC_NOZ_LHU | rfmt_rd(rd_s) | rfmt_rs1(rs1_s) | imm_c_lh;
|
||||||
|
invalid = ~|EXTENSION_ZCB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_LH: begin
|
||||||
|
instr_out = `RVOPC_NOZ_LH | rfmt_rd(rd_s) | rfmt_rs1(rs1_s) | imm_c_lh;
|
||||||
|
invalid = ~|EXTENSION_ZCB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_SB: begin
|
||||||
|
instr_out = `RVOPC_NOZ_SB | rfmt_rd(rd_s) | rfmt_rs1(rs1_s) | imm_c_lb;
|
||||||
|
invalid = ~|EXTENSION_ZCB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_SH: begin
|
||||||
|
instr_out = `RVOPC_NOZ_SH | rfmt_rd(rd_s) | rfmt_rs1(rs1_s) | imm_c_lh;
|
||||||
|
invalid = ~|EXTENSION_ZCB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_ZEXT_B: begin
|
||||||
|
instr_out = `RVOPC_NOZ_ANDI | rfmt_rd(rs1_s) | rfmt_rs1(rs1_s) | 32'h0ff00000;
|
||||||
|
invalid = ~|EXTENSION_ZCB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_SEXT_B: begin
|
||||||
|
instr_out = `RVOPC_NOZ_SEXT_B | rfmt_rd(rs1_s) | rfmt_rs1(rs1_s);
|
||||||
|
invalid = ~|EXTENSION_ZCB || ~|EXTENSION_ZBB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_ZEXT_H: begin
|
||||||
|
instr_out = `RVOPC_NOZ_ZEXT_H | rfmt_rd(rs1_s) | rfmt_rs1(rs1_s);
|
||||||
|
invalid = ~|EXTENSION_ZCB || ~|EXTENSION_ZBB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_SEXT_H: begin
|
||||||
|
instr_out = `RVOPC_NOZ_SEXT_H | rfmt_rd(rs1_s) | rfmt_rs1(rs1_s);
|
||||||
|
invalid = ~|EXTENSION_ZCB || ~|EXTENSION_ZBB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_NOT: begin
|
||||||
|
instr_out = `RVOPC_NOZ_XORI | rfmt_rd(rs1_s) | rfmt_rs1(rs1_s) | 32'hfff00000;
|
||||||
|
invalid = ~|EXTENSION_ZCB;
|
||||||
|
end
|
||||||
|
`RVOPC_C_MUL: begin
|
||||||
|
instr_out = `RVOPC_NOZ_MUL | rfmt_rd(rs1_s) | rfmt_rs1(rs1_s) | rfmt_rs2(rs2_s);
|
||||||
|
invalid = ~|EXTENSION_ZCB || ~|EXTENSION_M;
|
||||||
|
end
|
||||||
|
|
||||||
default: invalid = 1'b1;
|
default: invalid = 1'b1;
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
@ -146,4 +208,6 @@ endgenerate
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
`ifndef YOSYS
|
||||||
`default_nettype wire
|
`default_nettype wire
|
||||||
|
`endif
|
||||||
|
|
|
@ -181,6 +181,19 @@ localparam RV_RD_BITS = 5;
|
||||||
`define RVOPC_C_LWSP 16'b010???????????10
|
`define RVOPC_C_LWSP 16'b010???????????10
|
||||||
`define RVOPC_C_SWSP 16'b110???????????10
|
`define RVOPC_C_SWSP 16'b110???????????10
|
||||||
|
|
||||||
|
// Zcb simple additional compressed instructions
|
||||||
|
`define RVOPC_C_LBU 16'b100000????????00
|
||||||
|
`define RVOPC_C_LHU 16'b100001???0????00
|
||||||
|
`define RVOPC_C_LH 16'b100001???1????00
|
||||||
|
`define RVOPC_C_SB 16'b100010????????00
|
||||||
|
`define RVOPC_C_SH 16'b100011???0????00
|
||||||
|
`define RVOPC_C_ZEXT_B 16'b100111???1100001
|
||||||
|
`define RVOPC_C_SEXT_B 16'b100111???1100101
|
||||||
|
`define RVOPC_C_ZEXT_H 16'b100111???1101001
|
||||||
|
`define RVOPC_C_SEXT_H 16'b100111???1101101
|
||||||
|
`define RVOPC_C_NOT 16'b100111???1110101
|
||||||
|
`define RVOPC_C_MUL 16'b100111???10???01
|
||||||
|
|
||||||
// Copies provided here with 0 instead of ? so that these can be used to build 32-bit instructions in the decompressor
|
// Copies provided here with 0 instead of ? so that these can be used to build 32-bit instructions in the decompressor
|
||||||
|
|
||||||
`define RVOPC_NOZ_BEQ 32'b00000000000000000000000001100011
|
`define RVOPC_NOZ_BEQ 32'b00000000000000000000000001100011
|
||||||
|
@ -232,4 +245,10 @@ localparam RV_RD_BITS = 5;
|
||||||
`define RVOPC_NOZ_CSRRCI 32'b00000000000000000111000001110011
|
`define RVOPC_NOZ_CSRRCI 32'b00000000000000000111000001110011
|
||||||
`define RVOPC_NOZ_SYSTEM 32'b00000000000000000000000001110011
|
`define RVOPC_NOZ_SYSTEM 32'b00000000000000000000000001110011
|
||||||
|
|
||||||
|
// Non-RV32I instructions for Zcb:
|
||||||
|
`define RVOPC_NOZ_MUL 32'b00000010000000000000000000110011
|
||||||
|
`define RVOPC_NOZ_SEXT_B 32'b01100000010000000001000000010011
|
||||||
|
`define RVOPC_NOZ_SEXT_H 32'b01100000010100000001000000010011
|
||||||
|
`define RVOPC_NOZ_ZEXT_H 32'b00001000000000000100000000110011
|
||||||
|
|
||||||
`endif
|
`endif
|
||||||
|
|
|
@ -10,6 +10,7 @@ localparam EXTENSION_ZBB = 1;
|
||||||
localparam EXTENSION_ZBC = 1;
|
localparam EXTENSION_ZBC = 1;
|
||||||
localparam EXTENSION_ZBS = 1;
|
localparam EXTENSION_ZBS = 1;
|
||||||
localparam EXTENSION_ZBKB = 1;
|
localparam EXTENSION_ZBKB = 1;
|
||||||
|
localparam EXTENSION_ZCB = 1;
|
||||||
localparam EXTENSION_ZIFENCEI = 1;
|
localparam EXTENSION_ZIFENCEI = 1;
|
||||||
localparam EXTENSION_XH3BEXTM = 1;
|
localparam EXTENSION_XH3BEXTM = 1;
|
||||||
localparam EXTENSION_XH3IRQ = 1;
|
localparam EXTENSION_XH3IRQ = 1;
|
||||||
|
|
|
@ -10,6 +10,7 @@ localparam EXTENSION_ZBB = 0;
|
||||||
localparam EXTENSION_ZBC = 0;
|
localparam EXTENSION_ZBC = 0;
|
||||||
localparam EXTENSION_ZBS = 0;
|
localparam EXTENSION_ZBS = 0;
|
||||||
localparam EXTENSION_ZBKB = 0;
|
localparam EXTENSION_ZBKB = 0;
|
||||||
|
localparam EXTENSION_ZCB = 0;
|
||||||
localparam EXTENSION_ZIFENCEI = 0;
|
localparam EXTENSION_ZIFENCEI = 0;
|
||||||
localparam EXTENSION_XH3BEXTM = 0;
|
localparam EXTENSION_XH3BEXTM = 0;
|
||||||
localparam EXTENSION_XH3IRQ = 0;
|
localparam EXTENSION_XH3IRQ = 0;
|
||||||
|
|
Loading…
Reference in New Issue