feat: implement privileged mode support
This commit is contained in:
@@ -28,6 +28,13 @@ module Decoder(
|
||||
io_out_isWord,
|
||||
io_out_isSystem,
|
||||
io_out_isFenceI,
|
||||
io_out_isEcall,
|
||||
io_out_isEbreak,
|
||||
io_out_isMret,
|
||||
io_out_isSret,
|
||||
io_out_isSfenceVma,
|
||||
io_out_isXret,
|
||||
io_out_isWfi,
|
||||
io_out_isAmo,
|
||||
output [4:0] io_out_amoOp,
|
||||
output io_out_writesRd,
|
||||
@@ -36,7 +43,16 @@ module Decoder(
|
||||
|
||||
wire [7:0][4:0] _GEN = '{5'hE, 5'hD, 5'hC, 5'hB, 5'h12, 5'h11, 5'h10, 5'hA};
|
||||
wire [7:0][1:0] _GEN_0 = '{2'h3, 2'h2, 2'h1, 2'h0, 2'h3, 2'h2, 2'h1, 2'h0};
|
||||
wire _isSfenceVma_T = io_inst[14:12] == 3'h0;
|
||||
wire _d_isFenceI_T = io_inst[14:12] == 3'h1;
|
||||
wire isSystemOpcode = io_inst[6:0] == 7'h73;
|
||||
wire isFenceOpcode = io_inst[6:0] == 7'hF;
|
||||
wire isEcall = io_inst == 32'h73;
|
||||
wire isEbreak = io_inst == 32'h100073;
|
||||
wire isMret = io_inst == 32'h30200073;
|
||||
wire isSret = io_inst == 32'h10200073;
|
||||
wire isWfi = io_inst == 32'h10500073;
|
||||
wire isSfenceVma = isSystemOpcode & _isSfenceVma_T & io_inst[31:25] == 7'h9;
|
||||
wire d_isLui = io_inst[6:0] == 7'h37;
|
||||
wire _GEN_1 = io_inst[6:0] == 7'h17;
|
||||
wire _GEN_2 = io_inst[6:0] == 7'h6F;
|
||||
@@ -70,15 +86,15 @@ module Decoder(
|
||||
{5'h3},
|
||||
{5'h2},
|
||||
{{4'h0, io_inst[30]}}};
|
||||
wire _GEN_14 = io_inst[6:0] == 7'hF;
|
||||
wire _GEN_15 = _GEN_8 | _GEN_12;
|
||||
wire _GEN_16 = io_inst[6:0] == 7'h73;
|
||||
wire _GEN_17 = io_inst[6:0] == 7'h2F;
|
||||
wire _GEN_18 = _GEN_14 | _GEN_16;
|
||||
wire _GEN_19 = _GEN_7 | _GEN_8 | _GEN_12 | _GEN_18;
|
||||
wire _GEN_20 = _GEN_2 | _GEN_4 | _GEN_5;
|
||||
wire _GEN_21 =
|
||||
d_isLui | _GEN_1 | _GEN_2 | _GEN_4 | _GEN_5 | _GEN_6 | _GEN_19;
|
||||
wire _GEN_14 = _GEN_8 | _GEN_12;
|
||||
wire _GEN_15 =
|
||||
d_isLui | _GEN_1 | _GEN_2 | _GEN_4 | _GEN_5 | _GEN_6 | _GEN_7 | _GEN_14;
|
||||
wire _GEN_16 = io_inst[6:0] == 7'h2F;
|
||||
wire _GEN_17 = isFenceOpcode | isSystemOpcode;
|
||||
wire _GEN_18 = _GEN_7 | _GEN_8 | _GEN_12 | _GEN_17;
|
||||
wire _GEN_19 = _GEN_2 | _GEN_4 | _GEN_5;
|
||||
wire _GEN_20 =
|
||||
d_isLui | _GEN_1 | _GEN_2 | _GEN_4 | _GEN_5 | _GEN_6 | _GEN_18;
|
||||
assign io_out_pc = io_pc;
|
||||
assign io_out_inst = io_inst;
|
||||
assign io_out_rs1 = io_inst[19:15];
|
||||
@@ -95,11 +111,11 @@ module Decoder(
|
||||
assign io_out_opClass =
|
||||
_GEN_3
|
||||
? 4'h1
|
||||
: _GEN_20
|
||||
: _GEN_19
|
||||
? 4'h2
|
||||
: _GEN_6
|
||||
? 4'h3
|
||||
: _GEN_7 ? 4'h4 : _GEN_15 ? 4'h1 : _GEN_18 ? 4'h5 : _GEN_17 ? 4'h3 : 4'h0;
|
||||
: _GEN_7 ? 4'h4 : _GEN_14 ? 4'h1 : _GEN_17 ? 4'h5 : _GEN_16 ? 4'h3 : 4'h0;
|
||||
assign io_out_aluFn =
|
||||
d_isLui
|
||||
? 5'hF
|
||||
@@ -113,9 +129,9 @@ module Decoder(
|
||||
: _GEN_13[io_inst[14:12]])
|
||||
: 5'h0;
|
||||
assign io_out_memWidth =
|
||||
_GEN_21 | ~_GEN_17 ? {1'h0, _GEN_0[io_inst[14:12]]} : {2'h1, io_inst[14:12] != 3'h2};
|
||||
_GEN_20 | ~_GEN_16 ? {1'h0, _GEN_0[io_inst[14:12]]} : {2'h1, io_inst[14:12] != 3'h2};
|
||||
assign io_out_memSigned = ~(io_inst[14]);
|
||||
assign io_out_isLoad = ~(d_isLui | _GEN_1 | _GEN_20) & (_GEN_6 | ~_GEN_19 & _GEN_17);
|
||||
assign io_out_isLoad = ~(d_isLui | _GEN_1 | _GEN_19) & (_GEN_6 | ~_GEN_18 & _GEN_16);
|
||||
assign io_out_isStore =
|
||||
~(d_isLui | _GEN_1 | _GEN_2 | _GEN_4 | _GEN_5 | _GEN_6) & _GEN_7;
|
||||
assign io_out_isBranch = ~(d_isLui | _GEN_1 | _GEN_2 | _GEN_4) & _GEN_5;
|
||||
@@ -127,11 +143,16 @@ module Decoder(
|
||||
assign io_out_isWord = ~_GEN_10 & (_GEN_8 ? _d_isWord_T : _GEN_12 & _d_isWord_T_1);
|
||||
assign io_out_isSystem =
|
||||
~(d_isLui | _GEN_1 | _GEN_2 | _GEN_4 | _GEN_5 | _GEN_6 | _GEN_7 | _GEN_8 | _GEN_12
|
||||
| _GEN_14) & _GEN_16;
|
||||
assign io_out_isFenceI =
|
||||
~(d_isLui | _GEN_1 | _GEN_2 | _GEN_4 | _GEN_5 | _GEN_6 | _GEN_7 | _GEN_15) & _GEN_14
|
||||
& _d_isFenceI_T;
|
||||
assign io_out_isAmo = ~_GEN_21 & _GEN_17;
|
||||
| isFenceOpcode) & isSystemOpcode;
|
||||
assign io_out_isFenceI = ~_GEN_15 & isFenceOpcode & _d_isFenceI_T;
|
||||
assign io_out_isEcall = isEcall;
|
||||
assign io_out_isEbreak = isEbreak;
|
||||
assign io_out_isMret = isMret;
|
||||
assign io_out_isSret = isSret;
|
||||
assign io_out_isSfenceVma = isSfenceVma;
|
||||
assign io_out_isXret = isMret | isSret;
|
||||
assign io_out_isWfi = isWfi;
|
||||
assign io_out_isAmo = ~_GEN_20 & _GEN_16;
|
||||
assign io_out_amoOp = io_inst[31:27];
|
||||
assign io_out_writesRd =
|
||||
d_isLui
|
||||
@@ -150,15 +171,20 @@ module Decoder(
|
||||
? (|(io_inst[11:7]))
|
||||
: _GEN_12
|
||||
? (|(io_inst[11:7]))
|
||||
: ~_GEN_14
|
||||
& (_GEN_16
|
||||
: ~isFenceOpcode
|
||||
& (isSystemOpcode
|
||||
? (|(io_inst[11:7])) & (|(io_inst[14:12]))
|
||||
: _GEN_17 & (|(io_inst[11:7])))));
|
||||
: _GEN_16 & (|(io_inst[11:7])))));
|
||||
assign io_out_illegal =
|
||||
io_inst[6:0] != 7'h37 & io_inst[6:0] != 7'h17 & io_inst[6:0] != 7'h6F
|
||||
& io_inst[6:0] != 7'h67 & io_inst[6:0] != 7'h63 & io_inst[6:0] != 7'h3
|
||||
& io_inst[6:0] != 7'h23 & io_inst[6:0] != 7'h13 & io_inst[6:0] != 7'h1B
|
||||
& io_inst[6:0] != 7'h33 & io_inst[6:0] != 7'h3B & io_inst[6:0] != 7'hF
|
||||
& io_inst[6:0] != 7'h73 & io_inst[6:0] != 7'h2F;
|
||||
isSystemOpcode & io_inst == 32'h200073 | io_inst[6:0] != 7'h37 & io_inst[6:0] != 7'h17
|
||||
& io_inst[6:0] != 7'h6F & io_inst[6:0] != 7'h67 & io_inst[6:0] != 7'h63
|
||||
& io_inst[6:0] != 7'h3 & io_inst[6:0] != 7'h23 & io_inst[6:0] != 7'h13
|
||||
& io_inst[6:0] != 7'h1B & io_inst[6:0] != 7'h33 & io_inst[6:0] != 7'h3B
|
||||
& io_inst[6:0] != 7'hF & io_inst[6:0] != 7'h73 & io_inst[6:0] != 7'h2F | ~_GEN_15
|
||||
& (isFenceOpcode
|
||||
? (|(io_inst[14:12])) & io_inst[14:12] != 3'h1
|
||||
: isSystemOpcode & _isSfenceVma_T
|
||||
& ~((isEcall | isEbreak | isMret | isSret | isSfenceVma | isWfi)
|
||||
& io_inst != 32'h200073));
|
||||
endmodule
|
||||
|
||||
|
||||
Reference in New Issue
Block a user