OpenCores
URL https://opencores.org/ocsvn/xgate/xgate/trunk

Subversion Repositories xgate

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /xgate/trunk
    from Rev 96 to Rev 97
    Reverse comparison

Rev 96 → Rev 97

/rtl/verilog/xgate_risc.v
108,7 → 108,7
integer bfi, bfii; // Loop counter for Bit Field Insert function
 
// State machine sequence
parameter [3:0] //synopsys enum state_info
localparam [3:0] //synopsys enum state_info
IDLE = 4'b0000, // waiting for interrupt
CONT = 4'b0001, // Instruction processing state, first state
S_STALL = 4'b0010, // Simple Stall while updating PC after change of flow
126,9 → 126,9
 
 
// Semaphore states
parameter [1:0] NO_LOCK = 2'b00,
RISC_LOCK = 2'b10,
HOST_LOCK = 2'b11;
localparam [1:0] NO_LOCK = 2'b00,
RISC_LOCK = 2'b10,
HOST_LOCK = 2'b11;
 
 
reg [ 3:0] cpu_state; // State register for instruction processing
141,6 → 141,10
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] 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] op_code; // Register for instruction being executed
reg ena_rd_low_byte; // Pseudo Register,
211,15 → 215,19
wire chid_goto_idle; //
 
// Debug states for change CHID
parameter [1:0] CHID_IDLE = 2'b00,
CHID_TEST = 2'b10,
CHID_WAIT = 2'b11;
localparam [1:0] CHID_IDLE = 2'b00,
CHID_TEST = 2'b10,
CHID_WAIT = 2'b11;
 
 
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 pc_sum = program_counter + pc_incr_mux;
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 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 mem_access = data_access || load_next_inst || start_thread;
240,7 → 248,6
 
// Decode register select for RD and RS
always @*
begin
case (op_code[10:8]) // synopsys parallel_case
3'b001 : rd_data = xgr1;
3'b010 : rd_data = xgr2;
251,7 → 258,6
3'b111 : rd_data = xgr7;
default : rd_data = 16'h0; // XGR0 is always Zero
endcase
end
 
assign wrt_reg_sel = (cpu_state == BOOT_3) ? 3'b001 :
(sel_rd_field ? op_code[10:8] : op_code[4:2]);
312,7 → 318,7
if ( !async_rst_b )
software_error <= 1'b0;
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);
 
assign xg_sw_irq = software_error && xgie;
338,7 → 344,7
end
else
begin
debug_active <= !xgdbg_clear && (cmd_dbg ||
debug_active <= !xgdbg_clear && (cmd_dbg || pc_error ||
brk_set_dbg || op_code_error || debug_active);
debug_edge <= debug_active;
end
361,7 → 367,7
if ( !async_rst_b )
cpu_state <= IDLE;
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
always @(posedge risc_clk or negedge async_rst_b)
459,7 → 465,7
j = j + 1;
end
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)
xgif_d[31:16] = ~clear_xgif_data & xgif_status[31:16];
if (clear_xgif_2)
2123,14 → 2129,14
// Three to Eight line decoder
always @*
case (semaph_risc) // synopsys parallel_case
4'h0 : semap_risc_bit = 8'b0000_0001;
4'h1 : semap_risc_bit = 8'b0000_0010;
4'h2 : semap_risc_bit = 8'b0000_0100;
4'h3 : semap_risc_bit = 8'b0000_1000;
4'h4 : semap_risc_bit = 8'b0001_0000;
4'h5 : semap_risc_bit = 8'b0010_0000;
4'h6 : semap_risc_bit = 8'b0100_0000;
4'h7 : semap_risc_bit = 8'b1000_0000;
3'h0 : semap_risc_bit = 8'b0000_0001;
3'h1 : semap_risc_bit = 8'b0000_0010;
3'h2 : semap_risc_bit = 8'b0000_0100;
3'h3 : semap_risc_bit = 8'b0000_1000;
3'h4 : semap_risc_bit = 8'b0001_0000;
3'h5 : semap_risc_bit = 8'b0010_0000;
3'h6 : semap_risc_bit = 8'b0100_0000;
3'h7 : semap_risc_bit = 8'b1000_0000;
endcase
 
assign semaph_stat = |risc_semap;
2393,7 → 2399,6
semap_state <= next_semap_state;
 
always @*
begin
case(semap_state)
NO_LOCK:
begin
2421,8 → 2426,6
default:
next_semap_state = NO_LOCK;
endcase
end
 
endmodule // semaphore_bit
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.