Entity: otbn_loop_controller

Diagram

int ImemAddrWidth clk_i rst_ni state_reset_i insn_valid_i [ImemAddrWidth-1:0] insn_addr_i [ImemAddrWidth-1:0] next_insn_addr_i loop_start_req_i loop_start_commit_i [11:0] loop_bodysize_i [31:0] loop_iterations_i jump_or_branch_i otbn_stall_i loop_jump_o [ImemAddrWidth-1:0] loop_jump_addr_o loop_err_o

Description

Copyright lowRISC contributors. Licensed under the Apache License, Version 2.0, see LICENSE for details. SPDX-License-Identifier: Apache-2.0

Generics

Generic name Type Value Description
ImemAddrWidth int 12

Ports

Port name Direction Type Description
clk_i input
rst_ni input
state_reset_i input
insn_valid_i input
insn_addr_i input [ImemAddrWidth-1:0]
next_insn_addr_i input [ImemAddrWidth-1:0]
loop_start_req_i input
loop_start_commit_i input
loop_bodysize_i input [11:0]
loop_iterations_i input [31:0]
loop_jump_o output
loop_jump_addr_o output [ImemAddrWidth-1:0]
loop_err_o output
jump_or_branch_i input
otbn_stall_i input

Signals

Name Type Description
loop_active_q logic
loop_active_d logic
current_loop_q loop_info_t
current_loop_d loop_info_t
at_current_loop_end_insn logic
current_loop_finish logic
next_loop loop_info_t
next_loop_valid logic
new_loop loop_info_t
new_loop_end_addr_full logic [LoopEndAddrWidth-1:0]
new_loop_end_addr_imem logic [ImemAddrWidth:0]
loop_stack_push_req logic
loop_stack_push logic
loop_stack_full logic
loop_stack_pop logic
loop_iteration_err logic
loop_branch_err logic
loop_stack_overflow_err logic
loop_at_end_err logic

Constants

Name Type Value Description
LoopStackDepth int unsigned 7 The loop controller has a current loop and then a stack of outer loops, this sets the size of the stack so maximum loop nesting depth is LoopStackDepth + 1.
LoopEndAddrWidth int unsigned 1 The ISA has a fixed 12 bits for loop_bodysize. The maximum possible address for the end of a loop is the maximum address in Imem (2^ImemAddrWidth - 4) plus loop_bodysize instructions (which take 4 * (2^12 - 1) bytes), plus 4 extra bytes. This simplifies to
(1 << ImemAddrWidth) + (1 << 14) - 4
which is strictly less than (1 << (max(ImemAddrWidth, 14) + 1)), so can be represented with max(ImemAddrWidth, 14) + 1 bits.

Types

Name Type Description
loop_info_t struct packed {
logic [ImemAddrWidth-1:0] loop_start;
logic [ImemAddrWidth:0] loop_end;
logic [31:0] loop_iterations;
}

Processes

Type: always_comb

Type: always_ff

Type: always_ff