|
|
|
@ -88,6 +88,7 @@ localparam |
|
|
|
logic [1:0] pending_a_read; |
|
|
|
logic [1:0] pending_a_read; |
|
|
|
logic [1:0] pending_x_read; |
|
|
|
logic [1:0] pending_x_read; |
|
|
|
logic [1:0] pending_y_read; |
|
|
|
logic [1:0] pending_y_read; |
|
|
|
|
|
|
|
logic [1:0] pending_p_stack_read; |
|
|
|
logic pending_rel_branch; |
|
|
|
logic pending_rel_branch; |
|
|
|
logic pending_nz_alu_update; |
|
|
|
logic pending_nz_alu_update; |
|
|
|
logic pending_c_alu_update; |
|
|
|
logic pending_c_alu_update; |
|
|
|
@ -105,6 +106,7 @@ initial mem_data_wr = 0; |
|
|
|
initial mem_wr = 0; |
|
|
|
initial mem_wr = 0; |
|
|
|
assign mem_addr_eff = mem_addr; |
|
|
|
assign mem_addr_eff = mem_addr; |
|
|
|
initial pending_a_read = 0; |
|
|
|
initial pending_a_read = 0; |
|
|
|
|
|
|
|
initial pending_p_stack_read = 0; |
|
|
|
initial pending_x_read = 0; |
|
|
|
initial pending_x_read = 0; |
|
|
|
initial pending_y_read = 0; |
|
|
|
initial pending_y_read = 0; |
|
|
|
initial pending_rel_branch = 0; |
|
|
|
initial pending_rel_branch = 0; |
|
|
|
@ -409,6 +411,12 @@ always @(posedge clk) |
|
|
|
end |
|
|
|
end |
|
|
|
pending_c_alu_update <= 0; |
|
|
|
pending_c_alu_update <= 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pending_p_stack_read) |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
P <= mem_data; |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
pending_p_stack_read <= 0; |
|
|
|
|
|
|
|
|
|
|
|
if (pending_bit_cmd) |
|
|
|
if (pending_bit_cmd) |
|
|
|
begin |
|
|
|
begin |
|
|
|
P[P_Z] <= (A & mem_data) == 0; |
|
|
|
P[P_Z] <= (A & mem_data) == 0; |
|
|
|
@ -574,13 +582,23 @@ always @(posedge clk) |
|
|
|
P[P_V] <= 0; |
|
|
|
P[P_V] <= 0; |
|
|
|
state <= STATE_FETCH; |
|
|
|
state <= STATE_FETCH; |
|
|
|
end |
|
|
|
end |
|
|
|
else if (decoded_instr == I_PHA) |
|
|
|
else if (decoded_instr == I_PHA || |
|
|
|
|
|
|
|
decoded_instr == I_PHP ) |
|
|
|
begin |
|
|
|
begin |
|
|
|
mem_aux2_addr <= {8'h01, S}; |
|
|
|
mem_aux2_addr <= {8'h01, S}; |
|
|
|
mem_sel <= DMUX_AUX2; |
|
|
|
mem_sel <= DMUX_AUX2; |
|
|
|
S <= S - 8'h01; |
|
|
|
S <= S - 8'h01; |
|
|
|
state <= STATE_EXECUTE_DATA_2; |
|
|
|
state <= STATE_EXECUTE_DATA_2; |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
else if (decoded_instr == I_PLA || |
|
|
|
|
|
|
|
decoded_instr == I_PLP ) |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
mem_aux2_addr <= {8'h01, S}; |
|
|
|
|
|
|
|
mem_sel <= DMUX_AUX2; |
|
|
|
|
|
|
|
S <= S + 8'h01; |
|
|
|
|
|
|
|
state <= STATE_EXECUTE_DATA_2; |
|
|
|
|
|
|
|
extra_timing <= 1'b1; |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
else if (decoded_instr == I_BNE) |
|
|
|
else if (decoded_instr == I_BNE) |
|
|
|
begin |
|
|
|
begin |
|
|
|
@ -830,6 +848,14 @@ always @(posedge clk) |
|
|
|
begin |
|
|
|
begin |
|
|
|
pending_y_read <= READ_SOURCE_MEM; |
|
|
|
pending_y_read <= READ_SOURCE_MEM; |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
else if(decoded_instr == I_PLA) |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
pending_a_read <= READ_SOURCE_MEM; |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
else if(decoded_instr == I_PLP) |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
pending_p_stack_read <= 1; |
|
|
|
|
|
|
|
end |
|
|
|
else if(decoded_instr == I_JMP) |
|
|
|
else if(decoded_instr == I_JMP) |
|
|
|
begin |
|
|
|
begin |
|
|
|
PC <= mem_addr; |
|
|
|
PC <= mem_addr; |
|
|
|
@ -919,6 +945,11 @@ always_comb |
|
|
|
mem_wr = 1'b1; |
|
|
|
mem_wr = 1'b1; |
|
|
|
mem_data_wr = A; |
|
|
|
mem_data_wr = A; |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
else if (decoded_instr == I_PHP) |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
mem_wr = 1'b1; |
|
|
|
|
|
|
|
mem_data_wr = P; |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
else if (state == STATE_EXECUTE_ZP) |
|
|
|
else if (state == STATE_EXECUTE_ZP) |
|
|
|
begin |
|
|
|
begin |
|
|
|
@ -2121,6 +2152,66 @@ always @(posedge clk) |
|
|
|
assert(Y == f_prev_Y); |
|
|
|
assert(Y == f_prev_Y); |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
always @(posedge clk) |
|
|
|
|
|
|
|
if (f_prev_valid && state == STATE_EXECUTE) |
|
|
|
|
|
|
|
if (f_prev_instruction == I_PHP) |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
cover($past(address_code) == ADDR_MODE_IMPLIED); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert($past(PC) == $past(f_prev_PC) + 16'd1); |
|
|
|
|
|
|
|
assert(f_prev_instr_cycles == 3); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert($past(mem_addr_eff, 2) == 16'h0100 + f_prev_S); |
|
|
|
|
|
|
|
assert($past(mem_data_wr, 2) == f_prev_P); |
|
|
|
|
|
|
|
assert($past(mem_wr, 2) == 1'b1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(S == f_prev_S - 8'h01); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(P == f_prev_P); |
|
|
|
|
|
|
|
assert(A == f_prev_A); |
|
|
|
|
|
|
|
assert(X == f_prev_X); |
|
|
|
|
|
|
|
assert(Y == f_prev_Y); |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
always @(posedge clk) |
|
|
|
|
|
|
|
if (f_prev_valid && state == STATE_EXECUTE) |
|
|
|
|
|
|
|
if (f_prev_instruction == I_PLA) |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
cover($past(address_code) == ADDR_MODE_IMPLIED); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert($past(PC) == $past(f_prev_PC) + 16'd1); |
|
|
|
|
|
|
|
assert(f_prev_instr_cycles == 4); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert($past(mem_data, 2) == A); |
|
|
|
|
|
|
|
assert($past(mem_wr, 2) == 1'b0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(S == f_prev_S + 8'h01); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert((A == 0) == P[P_Z]); |
|
|
|
|
|
|
|
assert(A[7] == P[P_N]); |
|
|
|
|
|
|
|
assert(X == f_prev_X); |
|
|
|
|
|
|
|
assert(Y == f_prev_Y); |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
always @(posedge clk) |
|
|
|
|
|
|
|
if (f_prev_valid && state == STATE_EXECUTE) |
|
|
|
|
|
|
|
if (f_prev_instruction == I_PLP) |
|
|
|
|
|
|
|
begin |
|
|
|
|
|
|
|
cover($past(address_code) == ADDR_MODE_IMPLIED); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert($past(PC) == $past(f_prev_PC) + 16'd1); |
|
|
|
|
|
|
|
assert(f_prev_instr_cycles == 4); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert($past(mem_data, 2) == P); |
|
|
|
|
|
|
|
assert($past(mem_wr, 2) == 1'b0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(S == f_prev_S + 8'h01); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(A == f_prev_A); |
|
|
|
|
|
|
|
assert(X == f_prev_X); |
|
|
|
|
|
|
|
assert(Y == f_prev_Y); |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
always @(posedge clk) |
|
|
|
always @(posedge clk) |
|
|
|
if (f_past_valid) |
|
|
|
if (f_past_valid) |
|
|
|
begin |
|
|
|
begin |
|
|
|
@ -2165,6 +2256,9 @@ begin |
|
|
|
decoded_instr == I_BVC || |
|
|
|
decoded_instr == I_BVC || |
|
|
|
decoded_instr == I_BVS || |
|
|
|
decoded_instr == I_BVS || |
|
|
|
decoded_instr == I_PHA || |
|
|
|
decoded_instr == I_PHA || |
|
|
|
|
|
|
|
decoded_instr == I_PHP || |
|
|
|
|
|
|
|
decoded_instr == I_PLA || |
|
|
|
|
|
|
|
decoded_instr == I_PLP || |
|
|
|
decoded_instr == I_JMP |
|
|
|
decoded_instr == I_JMP |
|
|
|
); |
|
|
|
); |
|
|
|
assume(address_code != ADDR_MODE_INDIRECT); |
|
|
|
assume(address_code != ADDR_MODE_INDIRECT); |
|
|
|
|