diff options
Diffstat (limited to 'src/rtl/keywrap_core.v')
-rw-r--r-- | src/rtl/keywrap_core.v | 65 |
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; |