aboutsummaryrefslogtreecommitdiff
path: root/src/rtl/keywrap_core.v
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtl/keywrap_core.v')
-rw-r--r--src/rtl/keywrap_core.v65
1 files changed, 57 insertions, 8 deletions
diff --git a/src/rtl/keywrap_core.v b/src/rtl/keywrap_core.v
index 8688e31..00e8391 100644
--- a/src/rtl/keywrap_core.v
+++ b/src/rtl/keywrap_core.v
@@ -61,9 +61,9 @@ module keywrap_core #(parameter MEM_BITS = 11)
output wire valid,
input wire [(MEM_BITS - 2) : 0] rlen,
-
input wire [255 : 0] key,
input wire keylen,
+ input wire [31 : 0] status,
output wire [255 : 0] mkey,
output wire [31 : 0] mstatus,
@@ -95,9 +95,13 @@ module keywrap_core #(parameter MEM_BITS = 11)
localparam CTRL_NEXT_FINALIZE = 6'ha;
localparam CTRL_MKM_RD_START = 6'h10;
- localparam CTRL_MKM_RD_END = 6'h11;
+ localparam CTRL_MKM_RD_WAIT0 = 6'h11;
+ localparam CTRL_MKM_RD_STATUS = 6'h12;
+ localparam CTRL_MKM_RD_END = 6'h13;
+
localparam CTRL_MKM_WR_START = 6'h18;
- localparam CTRL_MKM_WR_END = 6'h19;
+ localparam CTRL_MKM_WR_WAIT0 = 6'h19;
+ localparam CTRL_MKM_WR_END = 6'h1a;
// API for mkm used by the core.
localparam MKM_ADDR_CTRL = 8'h08;
@@ -111,8 +115,8 @@ module keywrap_core #(parameter MEM_BITS = 11)
localparam MKM_ADDR_EMEM_DATA = 8'h20;
// Addresses for storage in the mkm
- localparam MKM_STATUS_WORD = 8'h00;
- localparam MKM_KEY_BASE_WORD = 8'h04;
+ localparam MKM_STATUS_WORD = 16'h00;
+ localparam MKM_KEY_BASE_WORD = 16'h04;
localparam DEFAULT_SCLK_DIV = 16'h0020;
@@ -264,7 +268,7 @@ module keywrap_core #(parameter MEM_BITS = 11)
assign a_result = a_reg;
assign ready = ready_reg;
assign valid = valid_reg;
- assign mkm_status = mkm_status_reg;
+ assign mstatus = mkm_status_reg;
//----------------------------------------------------------------
@@ -637,11 +641,45 @@ module keywrap_core #(parameter MEM_BITS = 11)
CTRL_MKM_RD_START:
begin
- keywrap_core_ctrl_new = CTRL_MKM_RD_END;
+ mkm_init_op = 1'h1;
+ keywrap_core_ctrl_new = CTRL_MKM_RD_WAIT0;
keywrap_core_ctrl_we = 1'h1;
end
+ CTRL_MKM_RD_WAIT0:
+ begin
+ if (mkm_ready)
+ // MKM should have been initialized.
+ if (mkey_mstatus)
+ begin
+ // Read master key from mkm.
+ keywrap_core_ctrl_new = CTRL_MKM_RD_END;
+ keywrap_core_ctrl_we = 1'h1;
+ end
+ else
+ begin
+ // Read master key status from mkm.
+ mkm_read_op = 1'h1;
+ mkm_addr = MKM_STATUS_WORD;
+ keywrap_core_ctrl_new = CTRL_MKM_RD_STATUS;
+ keywrap_core_ctrl_we = 1'h1;
+ end
+ end
+
+
+ CTRL_MKM_RD_STATUS:
+ begin
+ if (mkm_ready)
+ begin
+ // status should have been read.
+ mkm_status_we = 1'h1;
+ keywrap_core_ctrl_new = CTRL_MKM_RD_END;
+ keywrap_core_ctrl_we = 1'h1;
+ end
+ end
+
+
CTRL_MKM_RD_END:
begin
ready_new = 1'h1;
@@ -653,11 +691,22 @@ module keywrap_core #(parameter MEM_BITS = 11)
CTRL_MKM_WR_START:
begin
- keywrap_core_ctrl_new = CTRL_MKM_WR_END;
+ mkm_init_op = 1'h1;
+ keywrap_core_ctrl_new = CTRL_MKM_WR_WAIT0;
keywrap_core_ctrl_we = 1'h1;
end
+ CTRL_MKM_WR_WAIT0:
+ begin
+ if (mkm_ready)
+ begin
+ keywrap_core_ctrl_new = CTRL_MKM_WR_END;
+ keywrap_core_ctrl_we = 1'h1;
+ end
+ end
+
+
CTRL_MKM_WR_END:
begin
ready_new = 1'h1;