OpenCores
URL https://opencores.org/ocsvn/t6507lp/t6507lp/trunk

Subversion Repositories t6507lp

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /t6507lp/trunk/rtl/verilog
    from Rev 129 to Rev 136
    Reverse comparison

Rev 129 → Rev 136

/t6507lp.v
55,10 → 55,10
localparam [3:0] ADDR_SIZE_ = ADDR_SIZE - 4'b0001;
 
// note: in the top level inputs are just inputs, outputs are just outputs and the internal signals are wired.
input clk;
input reset_n;
input [DATA_SIZE_:0] data_in;
output rw_mem;
input clk;
input reset_n;
input [DATA_SIZE_:0] data_in;
output rw_mem;
output [DATA_SIZE_:0] data_out;
output [ADDR_SIZE_:0] address;
 
71,7 → 71,7
wire alu_enable;
 
// `include "T6507LP_Package.v"
//TODO change rw_mem to mem_rw
//TODO change rw_mem to mem_rw
t6507lp_fsm #(DATA_SIZE, ADDR_SIZE) t6507lp_fsm(
.clk (clk),
.reset_n (reset_n),
88,15 → 88,15
.alu_enable (alu_enable)
);
 
T6507LP_ALU T6507LP_ALU (
.clk_i (clk),
.n_rst_i (reset_n),
.alu_enable (alu_enable),
.alu_result (alu_result),
.alu_status (alu_status),
.alu_opcode (alu_opcode),
.alu_a (alu_a),
.alu_x (alu_x),
.alu_y (alu_y)
);
T6507LP_ALU T6507LP_ALU (
.clk (clk),
.rst_n (reset_n),
.alu_enable (alu_enable),
.alu_result (alu_result),
.alu_status (alu_status),
.alu_opcode (alu_opcode),
.alu_a (alu_a),
.alu_x (alu_x),
.alu_y (alu_y)
);
endmodule
/T6507LP_ALU.v
46,10 → 46,10
 
// TODO: verify code identation
 
module T6507LP_ALU( clk_i, n_rst_i, alu_enable, alu_result, alu_status, alu_opcode, alu_a, alu_x, alu_y );
module T6507LP_ALU( clk, reset_n, alu_enable, alu_result, alu_status, alu_opcode, alu_a, alu_x, alu_y );
 
input wire clk_i;
input wire n_rst_i;
input wire clk;
input wire reset_n;
input wire alu_enable;
input wire [7:0] alu_opcode;
input wire [7:0] alu_a;
64,21 → 64,14
 
reg [7:0] STATUS;
reg [7:0] result;
reg [7:0] temp1;
reg [7:0] temp2;
reg [7:0] bcd1;
reg [7:0] bcd2;
 
`include "T6507LP_Package.v"
`include "t6507lp_package.v"
 
//always @ * begin
// STATUS[Z] = (result == 0) ? 1 : 0;
// STATUS[N] = result[7];
// STATUS[5] = 1;
//end
 
 
always @ (posedge clk_i or negedge n_rst_i)
always @ (posedge clk or negedge reset_n)
begin
if (n_rst_i == 0) begin
if (reset_n == 0) begin
//$display("RESTART");
alu_result <= 0;
alu_status[C] <= 0;
93,72 → 86,42
Y <= 0;
alu_x <= 0;
alu_y <= 0;
//STATUS[C] <= 0;
//STATUS[N] <= 0;
//STATUS[V] <= 0;
//STATUS[Z] <= 1;
//STATUS[I] <= 0;
//STATUS[B] <= 0;
//STATUS[D] <= 0;
end
else if ( alu_enable == 1 ) begin
//A <= A;
//X <= X;
//Y <= Y;
case (alu_opcode)
ADC_IMM, ADC_ZPG, ADC_ZPX, ADC_ABS, ADC_ABX, ADC_ABY, ADC_IDX, ADC_IDY,
AND_IMM, AND_ZPG, AND_ZPX, AND_ABS, AND_ABX, AND_ABY, AND_IDX, AND_IDY,
ASL_ACC,
EOR_IMM, EOR_ZPG, EOR_ZPX, EOR_ABS, EOR_ABX, EOR_ABY, EOR_IDX, EOR_IDY,
LSR_ACC,
ORA_IMM, ORA_ZPG, ORA_ZPX, ORA_ABS, ORA_ABX, ORA_ABY, ORA_IDX, ORA_IDY,
ROL_ACC, ROR_ACC,
SBC_IMM, SBC_ZPG, SBC_ZPX, SBC_ABS, SBC_ABX, SBC_ABY, SBC_IDX, SBC_IDY,
LDA_IMM, LDA_ZPG, LDA_ZPX, LDA_ABS, LDA_ABX, LDA_ABY, LDA_IDX, LDA_IDY,
PLA_IMP,
TXA_IMP, TYA_IMP :
ASL_ACC, EOR_IMM, EOR_ZPG, EOR_ZPX, EOR_ABS, EOR_ABX, EOR_ABY, EOR_IDX,
EOR_IDY, LSR_ACC, ORA_IMM, ORA_ZPG, ORA_ZPX, ORA_ABS, ORA_ABX, ORA_ABY,
ORA_IDX, ORA_IDY, ROL_ACC, ROR_ACC, SBC_IMM, SBC_ZPG, SBC_ZPX, SBC_ABS,
SBC_ABX, SBC_ABY, SBC_IDX, SBC_IDY, LDA_IMM, LDA_ZPG, LDA_ZPX, LDA_ABS,
LDA_ABX, LDA_ABY, LDA_IDX, LDA_IDY, PLA_IMP, TXA_IMP, TYA_IMP :
begin
A <= result;
alu_result <= result;
A <= result;
alu_status <= STATUS;
end
// LDA_IMM, LDA_ZPG, LDA_ZPX, LDA_ABS, LDA_ABX, LDA_ABY, LDA_IDX, LDA_IDY,
//PLA_IMP:
//begin
// A <= result;
// alu_status <= STATUS;
//$display("A <= result;");
//$display("%h <= %h", A, result);
//$display("alu_status <= STATUS;");
//$display("%h <= %h", alu_status, STATUS);
//end
LDX_IMM, LDX_ZPG, LDX_ZPY, LDX_ABS, LDX_ABY, TAX_IMP, TSX_IMP, INX_IMP, DEX_IMP :
begin
//$display("Aqui deu erro");
//$display("X <= Result");
//$display("%h <= %h", X, result);
X <= result;
alu_x <= result;
X <= result;
alu_x <= result;
alu_status <= STATUS;
end
TXS_IMP :
begin
X <= result;
X <= result;
alu_x <= result;
end
LDY_IMM, LDY_ZPG, LDY_ZPX, LDY_ABS, LDY_ABX, TAY_IMP, INY_IMP, DEY_IMP :
begin
Y <= result;
alu_y <= result;
Y <= result;
alu_y <= result;
alu_status <= STATUS;
end
LSR_ZPG, LSR_ZPX, LSR_ABS, LSR_ABX,
ROL_ZPG, ROL_ZPX, ROL_ABS, ROL_ABX,
ROR_ZPG, ROR_ZPX, ROR_ABS, ROR_ABX,
CMP_IMM, CMP_ZPG, CMP_ZPX, CMP_ABS, CMP_ABX, CMP_ABY, CMP_IDX, CMP_IDY,
CPX_IMM, CPX_ZPG, CPX_ABS,
CPY_IMM, CPY_ZPG, CPY_ABS,
PHP_IMP :
LSR_ZPG, LSR_ZPX, LSR_ABS, LSR_ABX, ROL_ZPG, ROL_ZPX, ROL_ABS, ROL_ABX,
ROR_ZPG, ROR_ZPX, ROR_ABS, ROR_ABX, CMP_IMM, CMP_ZPG, CMP_ZPX, CMP_ABS,
CMP_ABX, CMP_ABY, CMP_IDX, CMP_IDY, CPX_IMM, CPX_ZPG, CPX_ABS, CPY_IMM,
CPY_ZPG, CPY_ABS, PHP_IMP :
begin
alu_status <= STATUS;
end
218,9 → 181,9
end
 
always @ (*) begin
temp1 = A;
temp2 = alu_a;
result = alu_result;
bcd1 = A;
bcd2 = alu_a;
result = alu_result;
STATUS[C] = alu_status[C];
STATUS[V] = alu_status[V];
STATUS[Z] = (result == 0) ? 1 : 0;
229,12 → 192,11
STATUS[B] = alu_status[B];
STATUS[I] = alu_status[I];
STATUS[D] = alu_status[D];
 
case (alu_opcode)
// BIT - Bit Test
BIT_ZPG, BIT_ABS:
begin
BIT_ZPG, BIT_ABS: begin
result = A & alu_a;
//STATUS[V] = alu_a[6];
end
 
// BRK - Force Interrupt
277,8 → 239,7
// PHA - Push A
// TAX - Transfer Accumulator to X
// TAY - Transfer Accumulator to Y
TAX_IMP, TAY_IMP, PHA_IMP, STA_ZPG, STA_ZPX, STA_ABS, STA_ABX, STA_ABY, STA_IDX, STA_IDY :
begin
TAX_IMP, TAY_IMP, PHA_IMP, STA_ZPG, STA_ZPX, STA_ABS, STA_ABX, STA_ABY, STA_IDX, STA_IDY : begin
result = A;
end
 
285,15 → 246,13
// STX - Store X Register
// TXA - Transfer X to Accumulator
// TXS - Transfer X to Stack pointer
STX_ZPG, STX_ZPY, STX_ABS, TXA_IMP, TXS_IMP :
begin
STX_ZPG, STX_ZPY, STX_ABS, TXA_IMP, TXS_IMP : begin
result = X;
end
// STY - Store Y Register
// TYA - Transfer Y to Accumulator
STY_ZPG, STY_ZPX, STY_ABS, TYA_IMP :
begin
STY_ZPG, STY_ZPX, STY_ABS, TYA_IMP : begin
result = Y;
end
 
313,8 → 272,7
end
 
// INC - Increment memory
INC_ZPG, INC_ZPX, INC_ABS, INC_ABX :
begin
INC_ZPG, INC_ZPX, INC_ABS, INC_ABX : begin
result = alu_a + 1;
end
 
329,8 → 287,7
end
 
// DEC - Decrement memory
DEC_ZPG, DEC_ZPX, DEC_ABS, DEC_ABX :
begin
DEC_ZPG, DEC_ZPX, DEC_ABS, DEC_ABX : begin
result = alu_a - 1;
end
 
345,27 → 302,24
end
 
// ADC - Add with carry
ADC_IMM, ADC_ZPG, ADC_ZPX, ADC_ABS, ADC_ABX, ADC_ABY, ADC_IDX, ADC_IDY :
begin
//temp1 = A;
//temp2 = alu_a;
ADC_IMM, ADC_ZPG, ADC_ZPX, ADC_ABS, ADC_ABX, ADC_ABY, ADC_IDX, ADC_IDY : begin
if (alu_status[D] == 1) begin
if (A[3:0] > 9) begin
temp1 = A + 6; // A = A - 10 and A = A + 16
bcd1 = A + 6; // A = A - 10 and A = A + 16
end
if (temp1[7:4] > 9) begin
temp1 = temp1[7:4] + 6; // A = A - 10 and A = A + 16
if (bcd1[7:4] > 9) begin
bcd1 = bcd1[7:4] + 6; // A = A - 10 and A = A + 16
end
if (alu_a[3:0] > 9) begin
temp2 = alu_a + 6;
bcd2 = alu_a + 6;
end
if (temp2[7:4] > 9) begin
temp2 = temp2[7:4] + 6; // A = A - 10 and A = A + 16
if (bcd2[7:4] > 9) begin
bcd2 = bcd2[7:4] + 6; // A = A - 10 and A = A + 16
end
end
 
{STATUS[C],result} = temp1 + temp2 + alu_status[C];
if ((temp1[7] == temp2[7]) && (temp1[7] != alu_result[7]))
{STATUS[C],result} = bcd1 + bcd2 + alu_status[C];
if ((bcd1[7] == bcd2[7]) && (bcd1[7] != alu_result[7]))
STATUS[V] = 1;
else
STATUS[V] = 0;
382,21 → 336,18
end
// AND - Logical AND
AND_IMM, AND_ZPG, AND_ZPX, AND_ABS, AND_ABX, AND_ABY, AND_IDX, AND_IDY :
begin
AND_IMM, AND_ZPG, AND_ZPX, AND_ABS, AND_ABX, AND_ABY, AND_IDX, AND_IDY : begin
result = A & alu_a;
end
 
// CMP - Compare
CMP_IMM, CMP_ZPG, CMP_ZPX, CMP_ABS, CMP_ABX, CMP_ABY, CMP_IDX, CMP_IDY :
begin
CMP_IMM, CMP_ZPG, CMP_ZPX, CMP_ABS, CMP_ABX, CMP_ABY, CMP_IDX, CMP_IDY : begin
result = A - alu_a;
STATUS[C] = (A >= alu_a) ? 1 : 0;
end
 
// EOR - Exclusive OR
EOR_IMM, EOR_ZPG, EOR_ZPX, EOR_ABS, EOR_ABX, EOR_ABY, EOR_IDX, EOR_IDY :
begin
EOR_IMM, EOR_ZPG, EOR_ZPX, EOR_ABS, EOR_ABX, EOR_ABY, EOR_IDX, EOR_IDY : begin
result = A ^ alu_a ;
end
 
407,42 → 358,34
LDA_IMM, LDA_ZPG, LDA_ZPX, LDA_ABS, LDA_ABX, LDA_ABY, LDA_IDX, LDA_IDY,
LDX_IMM, LDX_ZPG, LDX_ZPY, LDX_ABS, LDX_ABY,
LDY_IMM, LDY_ZPG, LDY_ZPX, LDY_ABS, LDY_ABX,
TSX_IMP :
begin
TSX_IMP : begin
result = alu_a;
//$display("result = %h alu_a = %h",result, alu_a);
end
 
// ORA - Logical OR
ORA_IMM, ORA_ZPG, ORA_ZPX, ORA_ABS, ORA_ABX, ORA_ABY, ORA_IDX, ORA_IDY :
begin
ORA_IMM, ORA_ZPG, ORA_ZPX, ORA_ABS, ORA_ABX, ORA_ABY, ORA_IDX, ORA_IDY : begin
result = A | alu_a;
end
 
// SBC - Subtract with Carry
SBC_IMM, SBC_ZPG, SBC_ZPX, SBC_ABS, SBC_ABX, SBC_ABY, SBC_IDX, SBC_IDY :
begin
//temp1 = A;
//temp2 = alu_a;
SBC_IMM, SBC_ZPG, SBC_ZPX, SBC_ABS, SBC_ABX, SBC_ABY, SBC_IDX, SBC_IDY : begin
if (alu_status[D] == 1) begin
if (A[3:0] > 9) begin
temp1 = A + 6; // A = A - 10 and A = A + 16
bcd1 = A + 6; // A = A - 10 and A = A + 16
end
if (temp1[7:4] > 9) begin
temp1 = temp1[7:4] + 6; // A = A - 10 and A = A + 16
if (bcd1[7:4] > 9) begin
bcd1 = bcd1[7:4] + 6; // A = A - 10 and A = A + 16
end
if (alu_a[3:0] > 9) begin
temp2 = alu_a + 6;
bcd2 = alu_a + 6;
end
if (temp2[7:4] > 9) begin
temp2 = temp2[7:4] + 6; // A = A - 10 and A = A + 16
if (bcd2[7:4] > 9) begin
bcd2 = bcd2[7:4] + 6; // A = A - 10 and A = A + 16
end
end
 
{STATUS[C],result} = temp1 - temp2 - ~alu_status[C];
//$display("STATUS[C] = %h result = %h", STATUS[C],result);
//$display("temp1 = %h temp2 = %h alu_status = %h", temp1,temp2,alu_status[C]);
if ((temp1[7] == temp2[7]) && (temp1[7] != alu_result[7]))
{STATUS[C],result} = bcd1 - bcd2 - ~alu_status[C];
if ((bcd1[7] == bcd2[7]) && (bcd1[7] != alu_result[7]))
STATUS[V] = 1;
else
STATUS[V] = 0;
452,8 → 395,7
ASL_ACC : begin
{STATUS[C],result} = A << 1;
end
ASL_ZPG, ASL_ZPX, ASL_ABS, ASL_ABX :
begin
ASL_ZPG, ASL_ZPX, ASL_ABS, ASL_ABX : begin
{STATUS[C],result} = alu_a << 1;
end
 
461,8 → 403,7
LSR_ACC: begin
{result, STATUS[C]} = A >> 1;
end
LSR_ZPG, LSR_ZPX, LSR_ABS, LSR_ABX :
begin
LSR_ZPG, LSR_ZPX, LSR_ABS, LSR_ABX : begin
{result, STATUS[C]} = alu_a >> 1;
end
470,8 → 411,7
ROL_ACC : begin
{STATUS[C],result} = {A,alu_status[C]}; //TODO: does it really work?
end
ROL_ZPG, ROL_ZPX, ROL_ABS, ROL_ABX :
begin
ROL_ZPG, ROL_ZPX, ROL_ABS, ROL_ABX : begin
{STATUS[C],result} = {alu_a,alu_status[C]};
end
 
479,21 → 419,18
ROR_ACC : begin
{result,STATUS[C]} = {alu_status[C],A};
end
ROR_ZPG, ROR_ZPX, ROR_ABS, ROR_ABX :
begin
ROR_ZPG, ROR_ZPX, ROR_ABS, ROR_ABX : begin
{result, STATUS[C]} = {alu_status[C], alu_a};
end
 
// CPX - Compare X Register
CPX_IMM, CPX_ZPG, CPX_ABS :
begin
CPX_IMM, CPX_ZPG, CPX_ABS : begin
result = X - alu_a;
STATUS[C] = (X >= alu_a) ? 1 : 0;
end
 
// CPY - Compare Y Register
CPY_IMM, CPY_ZPG, CPY_ABS :
begin
CPY_IMM, CPY_ZPG, CPY_ABS : begin
result = Y - alu_a;
STATUS[C] = (Y >= alu_a) ? 1 : 0;
end
/t6507lp_alu_tb.v
0,0 → 1,579
`include "timescale.v"
module t6507lp_alu_tb;
 
`include "t6507lp_package.v"
 
reg clk;
reg reset;
reg alu_enable;
wire [7:0] alu_result;
wire [7:0] alu_status;
reg [7:0] alu_opcode;
reg [7:0] alu_a;
wire [7:0] alu_x;
wire [7:0] alu_y;
reg [31:0] i;
 
reg [7:0] alu_result_expected;
reg [7:0] alu_status_expected;
reg [7:0] alu_x_expected;
reg [7:0] alu_y_expected;
 
reg c_aux;
reg [7:0] temp;
 
t6507lp_alu DUT (
.clk (clk),
.reset_n (reset_n),
.alu_enable (alu_enable),
.alu_result (alu_result),
.alu_status (alu_status),
.alu_opcode (alu_opcode),
.alu_a (alu_a),
.alu_x (alu_x),
.alu_y (alu_y)
);
 
 
localparam period = 10;
 
task check;
begin
$display(" RESULTS EXPECTED");
$display("alu_result %h %h ", alu_result, alu_result_expected);
$display("alu_status %b %b ", alu_status, alu_status_expected);
$display("alu_x %h %h ", alu_x, alu_x_expected );
$display("alu_y %h %h ", alu_y, alu_y_expected );
if ((alu_result_expected != alu_result) || (alu_status_expected != alu_status) || (alu_x_expected != alu_x) || (alu_y_expected != alu_y))
begin
$display("ERROR at instruction %h",alu_opcode);
$finish;
end
else
begin
$display("Instruction %h... OK!", alu_opcode);
end
end
endtask
 
 
always begin
#(period/2) clk = ~clk;
end
 
initial
begin
// Reset
clk = 0;
reset_n = 0;
@(negedge clk_i);
@(negedge clk_i);
reset_n = 1;
alu_enable = 1;
alu_result_expected = 8'h00;
alu_status_expected = 8'b00100010;
alu_x_expected = 8'h00;
alu_y_expected = 8'h00;
 
// LDA
alu_a = 0;
alu_opcode = LDA_IMM;
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
@(negedge clk_i);
alu_result_expected = 8'h00;
// NV1BDIZC
alu_status_expected = 8'b00100010;
check();
 
// ADC
alu_opcode = ADC_IMM;
alu_a = 1;
for (i = 0; i < 1000; i = i + 1)
begin
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
{alu_status_expected[C], alu_result_expected} = alu_a + alu_result_expected + alu_status_expected[C];
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
alu_status_expected[V] = ((alu_a[7] == DUT.A[7]) && (alu_a[7] != alu_result_expected[7]));
check();
end
 
// SBC
alu_opcode = SBC_IMM;
for (i = 0; i < 1000; i = i + 1)
begin
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
{alu_status_expected[C], alu_result_expected} = alu_result_expected - alu_a - ~alu_status_expected[C];
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
alu_status_expected[V] = ((alu_a[7] == DUT.A[7]) && (alu_a[7] != alu_result_expected[7]));
check();
end
 
// LDA
alu_opcode = LDA_IMM;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
alu_result_expected = i;
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// LDX
alu_opcode = LDX_IMM;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
alu_x_expected = i;
//alu_result_expected = i;
alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_x_expected[7];
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// LDY
alu_opcode = LDY_IMM;
for (i = 0; i < 1001; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
alu_y_expected = i;
//alu_result_expected = i;
alu_status_expected[Z] = (alu_y_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_y_expected[7];
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// STA
alu_opcode = STA_ABS;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// STX
alu_opcode = STX_ABS;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//alu_result_expected = i;
//alu_x_expected = i;
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// STY
alu_opcode = STY_ABS;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//alu_result_expected = i;
//alu_y_expected = i;
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// CMP
alu_opcode = CMP_IMM;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
temp = alu_result_expected - alu_a;
alu_status_expected[Z] = (temp == 0) ? 1 : 0;
alu_status_expected[N] = temp[7];
alu_status_expected[C] = (alu_result_expected >= alu_a) ? 1 : 0;
//alu_result_expected = i;
//alu_y_expected = i;
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// CPX
alu_opcode = CPX_IMM;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
temp = alu_x_expected - alu_a;
alu_status_expected[Z] = (temp == 0) ? 1 : 0;
alu_status_expected[N] = temp[7];
alu_status_expected[C] = (alu_x_expected >= alu_a) ? 1 : 0;
//alu_result_expected = i;
//alu_y_expected = i;
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// CPY
alu_opcode = CPY_IMM;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
temp = alu_y_expected - alu_a;
alu_status_expected[Z] = (temp == 0) ? 1 : 0;
alu_status_expected[N] = temp[7];
alu_status_expected[C] = (alu_y_expected >= alu_a) ? 1 : 0;
//alu_result_expected = i;
//alu_y_expected = i;
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// AND
alu_opcode = AND_IMM;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
alu_result_expected = i & alu_result_expected;
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// ASL
alu_opcode = ASL_ACC;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
alu_status_expected[C] = alu_result_expected[7];
alu_result_expected[7:0] = alu_result_expected << 1;
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
check();
end
 
// INC
alu_opcode = INC_ZPG;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
alu_result_expected = alu_a + 1;
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
check();
end
 
// INX
alu_opcode = INX_IMP;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
alu_x_expected = alu_x_expected + 1;
alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_x_expected[7];
check();
end
 
// INY
alu_opcode = INY_IMP;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
alu_y_expected = alu_y_expected + 1;
alu_status_expected[Z] = (alu_y_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_y_expected[7];
check();
end
 
// DEC
alu_opcode = DEC_ZPG;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
alu_result_expected = alu_a - 1;
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
check();
end
 
// DEX
alu_opcode = DEX_IMP;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
alu_x_expected = alu_x_expected - 1;
alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_x_expected[7];
check();
end
 
// DEY
alu_opcode = DEY_IMP;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
alu_y_expected = alu_y_expected - 1;
alu_status_expected[Z] = (alu_y_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_y_expected[7];
check();
end
 
 
// LDA
alu_a = 0;
alu_opcode = LDA_IMM;
//$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
//$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
@(negedge clk_i);
alu_result_expected = 8'h00;
// NV1BDIZC
alu_status_expected = 8'b00100010;
check();
 
// BIT
alu_opcode = BIT_ZPG;
for (i = 0; i < 1000; i = i + 1)
begin
alu_a = i;
@(negedge clk_i);
$display("i = %d alu_opcode = %h alu_enable = %d", i, alu_opcode, alu_enable);
$display("DUT.A = %h DUT.X = %h DUT.Y = %h", DUT.A, DUT.X, DUT.Y);
$display("op1 = %d op2 = %d c = %d d = %d n = %d v = %d result = %d", alu_a, DUT.A, alu_status[C], alu_status[D], alu_status[N], alu_status[V], alu_result);
alu_status_expected[Z] = ((alu_a & alu_result_expected) == 0) ? 1 : 0;
alu_status_expected[V] = alu_a[6];
alu_status_expected[N] = alu_a[7];
check();
end
// SEC
alu_opcode = SEC_IMP;
@(negedge clk_i);
alu_status_expected[C] = 1;
check();
 
// SED
alu_opcode = SED_IMP;
@(negedge clk_i);
alu_status_expected[D] = 1;
check();
 
// SEI
alu_opcode = SEI_IMP;
@(negedge clk_i);
alu_status_expected[I] = 1;
check();
 
// CLC
alu_opcode = CLC_IMP;
@(negedge clk_i);
alu_status_expected[C] = 0;
check();
 
// CLD
alu_opcode = CLD_IMP;
@(negedge clk_i);
alu_status_expected[D] = 0;
check();
 
// CLI
alu_opcode = CLI_IMP;
@(negedge clk_i);
alu_status_expected[I] = 0;
check();
 
// CLV
alu_opcode = CLV_IMP;
@(negedge clk_i);
alu_status_expected[V] = 0;
check();
 
// LDA
alu_opcode = LDA_IMM;
alu_a = 8'h76;
@(negedge clk_i);
alu_result_expected = alu_a;
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
check();
 
// TAX
alu_opcode = TAX_IMP;
@(negedge clk_i);
alu_x_expected = alu_result_expected;
alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_x_expected[7];
check();
 
// TAY
alu_opcode = TAY_IMP;
@(negedge clk_i);
alu_y_expected = alu_result_expected;
alu_status_expected[Z] = (alu_y_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_y_expected[7];
check();
// TSX
alu_opcode = TSX_IMP;
@(negedge clk_i);
alu_x_expected = alu_a;
//alu_result_expected = alu_a;
alu_status_expected[Z] = (alu_x_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_x_expected[7];
check();
 
// TXA
alu_opcode = TXA_IMP;
@(negedge clk_i);
alu_result_expected = alu_x_expected;
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
check();
 
// TXS
alu_opcode = TXS_IMP;
@(negedge clk_i);
alu_result_expected = alu_x_expected;
check();
 
// TYA
alu_opcode = TYA_IMP;
@(negedge clk_i);
alu_result_expected = alu_y_expected;
alu_status_expected[Z] = (alu_result_expected == 0) ? 1 : 0;
alu_status_expected[N] = alu_result_expected[7];
check();
 
// Nothing should happen
// BCC
alu_opcode = BCC_REL;
@(negedge clk_i);
check();
 
// BCS
alu_opcode = BCS_REL;
@(negedge clk_i);
check();
 
// BEQ
alu_opcode = BEQ_REL;
@(negedge clk_i);
check();
 
// BMI
alu_opcode = BMI_REL;
@(negedge clk_i);
check();
 
// BNE
alu_opcode = BNE_REL;
@(negedge clk_i);
check();
 
// BPL
alu_opcode = BPL_REL;
@(negedge clk_i);
check();
 
// BVC
alu_opcode = BVC_REL;
@(negedge clk_i);
check();
 
// BVS
alu_opcode = BVS_REL;
@(negedge clk_i);
check();
// JMP
alu_opcode = JMP_ABS;
@(negedge clk_i);
check();
 
// JMP
alu_opcode = JMP_IND;
@(negedge clk_i);
check();
// JSR
alu_opcode = JSR_ABS;
@(negedge clk_i);
check();
// NOP
alu_opcode = NOP_IMP;
@(negedge clk_i);
check();
 
// RTS
alu_opcode = RTS_IMP;
@(negedge clk_i);
check();
$display("TEST PASSED");
$finish;
end
 
endmodule
 

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.