URL
https://opencores.org/ocsvn/a-z80/a-z80/trunk
Subversion Repositories a-z80
[/] [a-z80/] [trunk/] [cpu/] [alu/] [test_shifter_core.sv] - Rev 3
Compare with Previous | Blame | View Log
//==============================================================
// Test ALU shifter core block
//==============================================================
`timescale 100 ns/ 100 ns
module test_shifter_core;
// ----------------- INPUT -----------------
logic [7:0] db; // Input data bus
logic shift_in; // Input bit to be shifted in
logic shift_left; // Input control to left-shift
logic shift_right; // Input control to right-shift
// ----------------- OUTPUT -----------------
wire shift_db0; // db[0] for shift logic
wire shift_db7; // db[7] for shift logic
wire [3:0] out_high; // To internal ALU bus, high nibble
wire [3:0] out_low; // ..low nibble
// ----------------- TEST -------------------
`define CHECK(arg) \
assert({out_high,out_low}==arg);
initial begin
db = 8'h00;
shift_left = 0;
shift_right = 0;
shift_in = 0;
//------------------------------------------------------------
// Test load without shifting
db = 8'hAA;
#1 `CHECK(8'hAA);
db = 8'h55;
#1 `CHECK(8'h55);
//------------------------------------------------------------
// Test right shift, no carry-in
#1 db = 8'b00000001;
shift_right = 1;
shift_in = 0;
#1 `CHECK(8'b00000000);
db = 8'b00000010;
#1 `CHECK(8'b00000001);
db = 8'b00000100;
#1 `CHECK(8'b00000010);
db = 8'b00001000;
#1 `CHECK(8'b00000100);
db = 8'b00010000;
#1 `CHECK(8'b00001000);
db = 8'b00100000;
#1 `CHECK(8'b00010000);
db = 8'b01000000;
#1 `CHECK(8'b00100000);
db = 8'b10000000;
#1 `CHECK(8'b01000000);
// With carry-in
#1 db = 8'b00000001;
shift_in = 1;
#1 `CHECK(8'b10000000);
db = 8'b00000010;
#1 `CHECK(8'b10000001);
db = 8'b00000100;
#1 `CHECK(8'b10000010);
db = 8'b00001000;
#1 `CHECK(8'b10000100);
db = 8'b00010000;
#1 `CHECK(8'b10001000);
db = 8'b00100000;
#1 `CHECK(8'b10010000);
db = 8'b01000000;
#1 `CHECK(8'b10100000);
db = 8'b10000000;
#1 `CHECK(8'b11000000);
//------------------------------------------------------------
// Test left shift, no carry-in
#1 db = 8'b00000001;
shift_right = 0;
shift_left = 1;
shift_in = 0;
#1 `CHECK(8'b00000010);
db = 8'b00000010;
#1 `CHECK(8'b00000100);
db = 8'b00000100;
#1 `CHECK(8'b00001000);
db = 8'b00001000;
#1 `CHECK(8'b00010000);
db = 8'b00010000;
#1 `CHECK(8'b00100000);
db = 8'b00100000;
#1 `CHECK(8'b01000000);
db = 8'b01000000;
#1 `CHECK(8'b10000000);
db = 8'b10000000;
#1 `CHECK(8'b00000000);
// With carry-in
#1 db = 8'b00000001;
shift_in = 1;
#1 `CHECK(8'b00000011);
db = 8'b00000010;
#1 `CHECK(8'b00000101);
db = 8'b00000100;
#1 `CHECK(8'b00001001);
db = 8'b00001000;
#1 `CHECK(8'b00010001);
db = 8'b00010000;
#1 `CHECK(8'b00100001);
db = 8'b00100000;
#1 `CHECK(8'b01000001);
db = 8'b01000000;
#1 `CHECK(8'b10000001);
db = 8'b10000000;
#1 `CHECK(8'b00000001);
//------------------------------------------------------------
// Test right shift, no carry-in - special SRA instruction
// This instruction simply duplicates bit [7] instead of using CY
#1 db = 8'b00000001;
shift_right = 1;
shift_left = 0;
shift_in = shift_db7;
#1 `CHECK(8'b10000000);
db = 8'b00000010;
#1 `CHECK(8'b10000001);
db = 8'b00000100;
#1 `CHECK(8'b10000010);
db = 8'b00001000;
#1 `CHECK(8'b10000100);
db = 8'b00010000;
#1 `CHECK(8'b10001000);
db = 8'b00100000;
#1 `CHECK(8'b10010000);
db = 8'b01000000;
#1 `CHECK(8'b10100000);
db = 8'b10000000;
#1 `CHECK(8'b11000000);
// With carry-in
#1 db = 8'b00000001;
shift_in = 1;
#1 `CHECK(8'b10000000);
db = 8'b00000010;
#1 `CHECK(8'b10000001);
db = 8'b00000100;
#1 `CHECK(8'b10000010);
db = 8'b00001000;
#1 `CHECK(8'b10000100);
db = 8'b00010000;
#1 `CHECK(8'b10001000);
db = 8'b00100000;
#1 `CHECK(8'b10010000);
db = 8'b01000000;
#1 `CHECK(8'b10100000);
db = 8'b10000000;
#1 `CHECK(8'b11000000);
#1 $display("End of test");
end
//--------------------------------------------------------------
// Instantiate shifter core block and assign identical nets and variables
//--------------------------------------------------------------
alu_shifter_core alu_shifter_core_inst( .* );
endmodule