Line 106... |
Line 106... |
integer j; // Loop counters for decode of XGATE Interrupt Register
|
integer j; // Loop counters for decode of XGATE Interrupt Register
|
integer k; // Loop counter for Bit Field Insert decode
|
integer k; // Loop counter for Bit Field Insert decode
|
integer bfi, bfii; // Loop counter for Bit Field Insert function
|
integer bfi, bfii; // Loop counter for Bit Field Insert function
|
|
|
// State machine sequence
|
// State machine sequence
|
parameter [3:0] //synopsys enum state_info
|
localparam [3:0] //synopsys enum state_info
|
IDLE = 4'b0000, // waiting for interrupt
|
IDLE = 4'b0000, // waiting for interrupt
|
CONT = 4'b0001, // Instruction processing state, first state
|
CONT = 4'b0001, // Instruction processing state, first state
|
S_STALL = 4'b0010, // Simple Stall while updating PC after change of flow
|
S_STALL = 4'b0010, // Simple Stall while updating PC after change of flow
|
W_STORE = 4'b1101, // Stall while doing memory word write access
|
W_STORE = 4'b1101, // Stall while doing memory word write access
|
W_LOAD = 4'b0011, // Stall while doing memory word read access
|
W_LOAD = 4'b0011, // Stall while doing memory word read access
|
Line 124... |
Line 124... |
BOOT_3 = 4'b1011, //
|
BOOT_3 = 4'b1011, //
|
CHG_CHID = 4'b1100;
|
CHG_CHID = 4'b1100;
|
|
|
|
|
// Semaphore states
|
// Semaphore states
|
parameter [1:0] NO_LOCK = 2'b00,
|
localparam [1:0] NO_LOCK = 2'b00,
|
RISC_LOCK = 2'b10,
|
RISC_LOCK = 2'b10,
|
HOST_LOCK = 2'b11;
|
HOST_LOCK = 2'b11;
|
|
|
|
|
reg [ 3:0] cpu_state; // State register for instruction processing
|
reg [ 3:0] cpu_state; // State register for instruction processing
|
Line 139... |
Line 139... |
wire [15:0] pc_sum; // Program Counter Adder
|
wire [15:0] pc_sum; // Program Counter Adder
|
reg [15:0] pc_incr_mux; // Pseudo Register, mux to select the Program Counter Increment value
|
reg [15:0] pc_incr_mux; // Pseudo Register, mux to select the Program Counter Increment value
|
reg [15:0] next_pc; // Pseudo Register
|
reg [15:0] next_pc; // Pseudo Register
|
wire [15:0] jump_offset; // Address offset to be added to pc on conditional branch instruction
|
wire [15:0] jump_offset; // Address offset to be added to pc on conditional branch instruction
|
wire [15:0] bra_offset; // Address offset to be added to pc on branch always instruction
|
wire [15:0] bra_offset; // Address offset to be added to pc on branch always instruction
|
|
wire pc_carry; // Carry out bit from pc adder
|
|
wire pc_overflow; // Next pc is out-of-range
|
|
wire pc_underflow; // Next pc is out-of-range
|
|
wire pc_error; // Next pc calculation error
|
reg [15:0] alu_result; // Pseudo Register,
|
reg [15:0] alu_result; // Pseudo Register,
|
reg [15:0] op_code; // Register for instruction being executed
|
reg [15:0] op_code; // Register for instruction being executed
|
reg ena_rd_low_byte; // Pseudo Register,
|
reg ena_rd_low_byte; // Pseudo Register,
|
reg ena_rd_high_byte; // Pseudo Register,
|
reg ena_rd_high_byte; // Pseudo Register,
|
|
|
Line 209... |
Line 213... |
reg [ 1:0] chid_sm_ns; // Pseudo Register for State Machine next state logic,
|
reg [ 1:0] chid_sm_ns; // Pseudo Register for State Machine next state logic,
|
reg [ 1:0] chid_sm; //
|
reg [ 1:0] chid_sm; //
|
wire chid_goto_idle; //
|
wire chid_goto_idle; //
|
|
|
// Debug states for change CHID
|
// Debug states for change CHID
|
parameter [1:0] CHID_IDLE = 2'b00,
|
localparam [1:0] CHID_IDLE = 2'b00,
|
CHID_TEST = 2'b10,
|
CHID_TEST = 2'b10,
|
CHID_WAIT = 2'b11;
|
CHID_WAIT = 2'b11;
|
|
|
|
|
assign jump_offset = {{6{op_code[8]}}, op_code[8:0], 1'b0};
|
assign jump_offset = {{6{op_code[8]}}, op_code[8:0], 1'b0};
|
assign bra_offset = {{5{op_code[9]}}, op_code[9:0], 1'b0};
|
assign bra_offset = {{5{op_code[9]}}, op_code[9:0], 1'b0};
|
assign pc_sum = program_counter + pc_incr_mux;
|
assign pc_overflow = pc_carry & !pc_incr_mux[15];
|
|
assign pc_underflow = !pc_carry & pc_incr_mux[15];
|
|
assign pc_error = pc_overflow || pc_underflow;
|
|
|
|
assign {pc_carry, pc_sum} = program_counter + pc_incr_mux;
|
|
|
assign xgate_address = data_access ? data_address : program_counter;
|
assign xgate_address = data_access ? data_address : program_counter;
|
|
|
//assign mem_access = data_access || load_next_inst || start_thread;
|
//assign mem_access = data_access || load_next_inst || start_thread;
|
assign mem_access = data_access || load_next_inst || (cpu_state == CONT) ||
|
assign mem_access = data_access || load_next_inst || (cpu_state == CONT) ||
|
Line 238... |
Line 246... |
assign cpu_is_idle = (cpu_state == IDLE);
|
assign cpu_is_idle = (cpu_state == IDLE);
|
assign perif_wrt_ena = (cpu_is_idle && ~xge) || debug_active;
|
assign perif_wrt_ena = (cpu_is_idle && ~xge) || debug_active;
|
|
|
// Decode register select for RD and RS
|
// Decode register select for RD and RS
|
always @*
|
always @*
|
begin
|
|
case (op_code[10:8]) // synopsys parallel_case
|
case (op_code[10:8]) // synopsys parallel_case
|
3'b001 : rd_data = xgr1;
|
3'b001 : rd_data = xgr1;
|
3'b010 : rd_data = xgr2;
|
3'b010 : rd_data = xgr2;
|
3'b011 : rd_data = xgr3;
|
3'b011 : rd_data = xgr3;
|
3'b100 : rd_data = xgr4;
|
3'b100 : rd_data = xgr4;
|
3'b101 : rd_data = xgr5;
|
3'b101 : rd_data = xgr5;
|
3'b110 : rd_data = xgr6;
|
3'b110 : rd_data = xgr6;
|
3'b111 : rd_data = xgr7;
|
3'b111 : rd_data = xgr7;
|
default : rd_data = 16'h0; // XGR0 is always Zero
|
default : rd_data = 16'h0; // XGR0 is always Zero
|
endcase
|
endcase
|
end
|
|
|
|
assign wrt_reg_sel = (cpu_state == BOOT_3) ? 3'b001 :
|
assign wrt_reg_sel = (cpu_state == BOOT_3) ? 3'b001 :
|
(sel_rd_field ? op_code[10:8] : op_code[4:2]);
|
(sel_rd_field ? op_code[10:8] : op_code[4:2]);
|
|
|
// Decode register write select for eather RD or RI/RS2
|
// Decode register write select for eather RD or RI/RS2
|
Line 310... |
Line 316... |
// Software Error Interrupt Latch
|
// Software Error Interrupt Latch
|
always @(posedge risc_clk or negedge async_rst_b)
|
always @(posedge risc_clk or negedge async_rst_b)
|
if ( !async_rst_b )
|
if ( !async_rst_b )
|
software_error <= 1'b0;
|
software_error <= 1'b0;
|
else
|
else
|
software_error <= addr_error || op_code_error ||
|
software_error <= addr_error || op_code_error || pc_error ||
|
(brk_set_dbg && brk_irq_ena) || (software_error && !xgsweif_c);
|
(brk_set_dbg && brk_irq_ena) || (software_error && !xgsweif_c);
|
|
|
assign xg_sw_irq = software_error && xgie;
|
assign xg_sw_irq = software_error && xgie;
|
|
|
// Latch the need to go to debug state set by xgdb
|
// Latch the need to go to debug state set by xgdb
|
Line 336... |
Line 342... |
debug_active <= 1'b0;
|
debug_active <= 1'b0;
|
debug_edge <= 0;
|
debug_edge <= 0;
|
end
|
end
|
else
|
else
|
begin
|
begin
|
debug_active <= !xgdbg_clear && (cmd_dbg ||
|
debug_active <= !xgdbg_clear && (cmd_dbg || pc_error ||
|
brk_set_dbg || op_code_error || debug_active);
|
brk_set_dbg || op_code_error || debug_active);
|
debug_edge <= debug_active;
|
debug_edge <= debug_active;
|
end
|
end
|
|
|
assign debug_ack = debug_active && !debug_edge; // Posedge of debug_active
|
assign debug_ack = debug_active && !debug_edge; // Posedge of debug_active
|
Line 359... |
Line 365... |
// CPU State Register
|
// CPU State Register
|
always @(posedge risc_clk or negedge async_rst_b)
|
always @(posedge risc_clk or negedge async_rst_b)
|
if ( !async_rst_b )
|
if ( !async_rst_b )
|
cpu_state <= IDLE;
|
cpu_state <= IDLE;
|
else
|
else
|
cpu_state <= (mem_req_ack || stm_auto_advance) ? next_cpu_state : cpu_state;
|
cpu_state <= (mem_req_ack || stm_auto_advance || ~xge) ? next_cpu_state : cpu_state;
|
|
|
// CPU Instruction Register
|
// CPU Instruction Register
|
always @(posedge risc_clk or negedge async_rst_b)
|
always @(posedge risc_clk or negedge async_rst_b)
|
if ( !async_rst_b )
|
if ( !async_rst_b )
|
op_code <= 16'h0000;
|
op_code <= 16'h0000;
|
Line 457... |
Line 463... |
begin
|
begin
|
xgif_d[j] = xgif_status[j] || (set_irq_flag == j);
|
xgif_d[j] = xgif_status[j] || (set_irq_flag == j);
|
j = j + 1;
|
j = j + 1;
|
end
|
end
|
if (clear_xgif_0)
|
if (clear_xgif_0)
|
xgif_d[15: 1] = ~clear_xgif_data & xgif_status[15: 1];
|
xgif_d[15: 1] = ~clear_xgif_data[15:1] & xgif_status[15:1];
|
if (clear_xgif_1)
|
if (clear_xgif_1)
|
xgif_d[31:16] = ~clear_xgif_data & xgif_status[31:16];
|
xgif_d[31:16] = ~clear_xgif_data & xgif_status[31:16];
|
if (clear_xgif_2)
|
if (clear_xgif_2)
|
xgif_d[47:32] = ~clear_xgif_data & xgif_status[47:32];
|
xgif_d[47:32] = ~clear_xgif_data & xgif_status[47:32];
|
if (clear_xgif_3)
|
if (clear_xgif_3)
|
Line 2121... |
Line 2127... |
);
|
);
|
|
|
// Three to Eight line decoder
|
// Three to Eight line decoder
|
always @*
|
always @*
|
case (semaph_risc) // synopsys parallel_case
|
case (semaph_risc) // synopsys parallel_case
|
4'h0 : semap_risc_bit = 8'b0000_0001;
|
3'h0 : semap_risc_bit = 8'b0000_0001;
|
4'h1 : semap_risc_bit = 8'b0000_0010;
|
3'h1 : semap_risc_bit = 8'b0000_0010;
|
4'h2 : semap_risc_bit = 8'b0000_0100;
|
3'h2 : semap_risc_bit = 8'b0000_0100;
|
4'h3 : semap_risc_bit = 8'b0000_1000;
|
3'h3 : semap_risc_bit = 8'b0000_1000;
|
4'h4 : semap_risc_bit = 8'b0001_0000;
|
3'h4 : semap_risc_bit = 8'b0001_0000;
|
4'h5 : semap_risc_bit = 8'b0010_0000;
|
3'h5 : semap_risc_bit = 8'b0010_0000;
|
4'h6 : semap_risc_bit = 8'b0100_0000;
|
3'h6 : semap_risc_bit = 8'b0100_0000;
|
4'h7 : semap_risc_bit = 8'b1000_0000;
|
3'h7 : semap_risc_bit = 8'b1000_0000;
|
endcase
|
endcase
|
|
|
assign semaph_stat = |risc_semap;
|
assign semaph_stat = |risc_semap;
|
|
|
// Semaphore Bits
|
// Semaphore Bits
|
Line 2391... |
Line 2397... |
semap_state <= NO_LOCK;
|
semap_state <= NO_LOCK;
|
else
|
else
|
semap_state <= next_semap_state;
|
semap_state <= next_semap_state;
|
|
|
always @*
|
always @*
|
begin
|
|
case(semap_state)
|
case(semap_state)
|
NO_LOCK:
|
NO_LOCK:
|
begin
|
begin
|
if (host_wrt && host_bit_mask && host_bit)
|
if (host_wrt && host_bit_mask && host_bit)
|
next_semap_state = HOST_LOCK;
|
next_semap_state = HOST_LOCK;
|
Line 2419... |
Line 2424... |
next_semap_state = HOST_LOCK;
|
next_semap_state = HOST_LOCK;
|
end
|
end
|
default:
|
default:
|
next_semap_state = NO_LOCK;
|
next_semap_state = NO_LOCK;
|
endcase
|
endcase
|
end
|
|
|
|
endmodule // semaphore_bit
|
endmodule // semaphore_bit
|
|
|
|
|
|
|
No newline at end of file
|
No newline at end of file
|