Add irq status register
Upon receiving an interrupt, the corresponding bit in the interrupt status register will be set and an IRQ will be raised for the CPU. The cpu can then respond to the interrupt and clear the interrupt by writing back to the interrupt status register.
This commit is contained in:
75
hw/fpga/hvl/irq_testbench.sv
Normal file
75
hw/fpga/hvl/irq_testbench.sv
Normal file
@@ -0,0 +1,75 @@
|
||||
module testbench();
|
||||
|
||||
timeunit 10ns;
|
||||
|
||||
timeprecision 1ns;
|
||||
|
||||
logic clk_50, rst_n, button_1;
|
||||
logic [15:0] cpu_addr;
|
||||
wire [7:0] cpu_data;
|
||||
logic [7:0] cpu_data_in;
|
||||
logic [7:0] cpu_data_out;
|
||||
logic cpu_vpb, cpu_mlb, cpu_rwb, cpu_sync;
|
||||
logic cpu_led, cpu_resb, cpu_rdy, cpu_sob, cpu_irqb;
|
||||
logic cpu_phi2, cpu_be, cpu_nmib;
|
||||
logic [6:0] HEX0, HEX1, HEX2, HEX3, HEX4, HEX5;
|
||||
logic UART_RXD, UART_TXD;
|
||||
|
||||
assign cpu_data = ~cpu_rwb ? cpu_data_out : 'z;
|
||||
assign cpu_data_in = cpu_data;
|
||||
|
||||
super6502 dut(.*);
|
||||
|
||||
always #1 clk_50 = clk_50 === 1'b0;
|
||||
always #100 dut.clk = dut.clk === 1'b0;
|
||||
|
||||
always @(posedge dut.clk) begin
|
||||
dut.cpu_phi2 <= ~dut.cpu_phi2;
|
||||
end
|
||||
|
||||
logic [7:0] _tmp_data;
|
||||
|
||||
initial begin
|
||||
rst_n <= '0;
|
||||
cpu_addr <= 16'h7fff;
|
||||
cpu_rwb <= '1;
|
||||
button_1 <= '1;
|
||||
|
||||
repeat(10) @(posedge dut.clk);
|
||||
rst_n <= '1;
|
||||
|
||||
repeat(10) @(posedge dut.clk);
|
||||
|
||||
button_1 <= '0;
|
||||
@(posedge dut.clk);
|
||||
button_1 <= '1;
|
||||
@(posedge dut.clk);
|
||||
|
||||
assert(cpu_data[0] == '1)
|
||||
else begin
|
||||
$error("IRQ location should have bit 1 set!");
|
||||
end
|
||||
|
||||
@(posedge dut.clk);
|
||||
_tmp_data <= cpu_data_in;
|
||||
@(posedge dut.clk);
|
||||
|
||||
_tmp_data <= _tmp_data & ~8'b1;
|
||||
|
||||
@(posedge dut.clk);
|
||||
|
||||
cpu_data_out <= _tmp_data;
|
||||
cpu_rwb <= '0;
|
||||
|
||||
@(posedge dut.clk);
|
||||
|
||||
cpu_rwb <= '1;
|
||||
|
||||
repeat (5) @(posedge dut.clk);
|
||||
|
||||
$finish();
|
||||
|
||||
|
||||
end
|
||||
|
||||
endmodule
|
||||
Reference in New Issue
Block a user