From 27066a7ace629699a89e8f7282135cd76112d9e4 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Thu, 16 Nov 2023 18:54:25 -0800 Subject: [PATCH] Test interrupt priority --- .../simulation/tbs/interrupt_controller_tb.sv | 48 +++++++++++++++++-- hw/efinix_fpga/src/interrupt_controller.sv | 12 ++--- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/hw/efinix_fpga/simulation/tbs/interrupt_controller_tb.sv b/hw/efinix_fpga/simulation/tbs/interrupt_controller_tb.sv index cee9f5a..a234f5f 100644 --- a/hw/efinix_fpga/simulation/tbs/interrupt_controller_tb.sv +++ b/hw/efinix_fpga/simulation/tbs/interrupt_controller_tb.sv @@ -4,6 +4,8 @@ module interrupt_controller_tb(); logic r_clk_cpu; +localparam BITS_256 = 256'hffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + // clk_cpu initial begin r_clk_cpu <= '1; @@ -82,12 +84,43 @@ task test_level_irq(); end endtask -int errors; +task test_irq_val(); + int irq_val = -1; + $display("Testing IRQ val output"); + do_reset(); + set_enable('1); + set_edge_type('1); + for (int i = 255; i >= 0; i--) begin + set_interrupts(BITS_256 << i); + read_irqval(irq_val); + assert(i == irq_val) else begin + errors = errors + 1; + $display("Expected %d got %d", i, irq_val); + end + end + + for (int i = 0; i < 256; i++) begin + set_interrupts(BITS_256 >> i); + read_irqval(irq_val); + assert(int_out == 1) else begin + errors = errors + 1; + $display("int_out should be asserted!"); + end + assert(0 == irq_val) else begin + errors = errors + 1; + $display("Expected %d got %d", i, irq_val); + end + end + +endtask + +int errors; initial begin errors = 0; test_edge_irq(); test_level_irq(); + test_irq_val(); if (errors > 0) $finish_and_return(-1); else @@ -143,15 +176,15 @@ task do_reset(); endtask task set_enable(input logic [255:0] en); - for (int i = 0; i < 16; i++) begin - write_reg(0, 8'h10 | i); + for (int i = 0; i < 32; i++) begin + write_reg(0, 8'h20 | i); write_reg(1, en[8*i +: 8]); end endtask task set_edge_type(input logic [255:0] edge_type); - for (int i = 0; i < 16; i++) begin - write_reg(0, 8'h20 | i); + for (int i = 0; i < 32; i++) begin + write_reg(0, 8'h40 | i); write_reg(1, edge_type[8*i +: 8]); end endtask @@ -166,5 +199,10 @@ task send_eoi(); write_reg(1, 8'h01); endtask +task read_irqval(output logic [7:0] _irq_val); + write_reg(0, 8'h00); + read_reg(1, _irq_val); +endtask + endmodule diff --git a/hw/efinix_fpga/src/interrupt_controller.sv b/hw/efinix_fpga/src/interrupt_controller.sv index 6d9a9e1..7f54f31 100644 --- a/hw/efinix_fpga/src/interrupt_controller.sv +++ b/hw/efinix_fpga/src/interrupt_controller.sv @@ -82,19 +82,19 @@ always_comb begin if (addr == '1) begin unique casez (cmd) - 8'h0?: begin - $display("Case 0 not handled"); + 8'b000?????: begin + o_data = irq_val; end - 8'h1?: begin + 8'b001?????: begin w_enable_write = we; - w_byte_sel = cmd[3:0]; + w_byte_sel = cmd[4:0]; o_data = w_enable_data; end - 8'h2?: begin + 8'b010?????: begin w_type_write = we; - w_byte_sel = cmd[3:0]; + w_byte_sel = cmd[4:0]; o_data = w_type_data; end