Test interrupt priority

This commit is contained in:
Byron Lathi
2023-11-16 18:54:25 -08:00
parent b259d7f084
commit 27066a7ace
2 changed files with 49 additions and 11 deletions

View File

@@ -4,6 +4,8 @@ module interrupt_controller_tb();
logic r_clk_cpu; logic r_clk_cpu;
localparam BITS_256 = 256'hffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
// clk_cpu // clk_cpu
initial begin initial begin
r_clk_cpu <= '1; r_clk_cpu <= '1;
@@ -82,12 +84,43 @@ task test_level_irq();
end end
endtask 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 initial begin
errors = 0; errors = 0;
test_edge_irq(); test_edge_irq();
test_level_irq(); test_level_irq();
test_irq_val();
if (errors > 0) if (errors > 0)
$finish_and_return(-1); $finish_and_return(-1);
else else
@@ -143,15 +176,15 @@ task do_reset();
endtask endtask
task set_enable(input logic [255:0] en); task set_enable(input logic [255:0] en);
for (int i = 0; i < 16; i++) begin for (int i = 0; i < 32; i++) begin
write_reg(0, 8'h10 | i); write_reg(0, 8'h20 | i);
write_reg(1, en[8*i +: 8]); write_reg(1, en[8*i +: 8]);
end end
endtask endtask
task set_edge_type(input logic [255:0] edge_type); task set_edge_type(input logic [255:0] edge_type);
for (int i = 0; i < 16; i++) begin for (int i = 0; i < 32; i++) begin
write_reg(0, 8'h20 | i); write_reg(0, 8'h40 | i);
write_reg(1, edge_type[8*i +: 8]); write_reg(1, edge_type[8*i +: 8]);
end end
endtask endtask
@@ -166,5 +199,10 @@ task send_eoi();
write_reg(1, 8'h01); write_reg(1, 8'h01);
endtask endtask
task read_irqval(output logic [7:0] _irq_val);
write_reg(0, 8'h00);
read_reg(1, _irq_val);
endtask
endmodule endmodule

View File

@@ -82,19 +82,19 @@ always_comb begin
if (addr == '1) begin if (addr == '1) begin
unique casez (cmd) unique casez (cmd)
8'h0?: begin 8'b000?????: begin
$display("Case 0 not handled"); o_data = irq_val;
end end
8'h1?: begin 8'b001?????: begin
w_enable_write = we; w_enable_write = we;
w_byte_sel = cmd[3:0]; w_byte_sel = cmd[4:0];
o_data = w_enable_data; o_data = w_enable_data;
end end
8'h2?: begin 8'b010?????: begin
w_type_write = we; w_type_write = we;
w_byte_sel = cmd[3:0]; w_byte_sel = cmd[4:0];
o_data = w_type_data; o_data = w_type_data;
end end