Test interrupt priority
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user