iverilog/ivtest/ivltests/talu.v

117 lines
3.1 KiB
Verilog

/* talu - a verilog test,
* illustrating problems I had in fragments of an ALU from an 8-bit micro
*/
module talu;
reg error;
reg [7:0] a;
reg [7:0] b;
reg cin;
reg [1:0] op;
wire cout;
wire [7:0] aluout;
alu alu_m(a, b, cin, op, aluout, cout);
initial begin
error = 0;
// add
op='b00; cin='b0; a='h0; b='h0;
#2 if({cout, aluout} != 9'h000) begin
$display($time, " FAILED %b %b %h %h %b %h", op, cin, a, b, cout, aluout);
error = 1;
end
// add1
op='b01; cin='b0; a='h01; b='h01;
#2 if({cout, aluout} != 9'h103) begin
$display($time, " FAILED %b %b %h %h %b %h", op, cin, a, b, cout, aluout);
error = 1;
end
// and
op='b10; cin='b0; a='h16; b='h0F;
#2 if({cout, aluout} != 9'h006) begin
$display($time, " FAILED %b %b %h %h %b %h", op, cin, a, b, cout, aluout);
error = 1;
end
op='b10; cin='b0; a='h28; b='hF7;
#2 if({cout, aluout} != 9'h020) begin
$display($time, " FAILED %b %b %h %h %b %h", op, cin, a, b, cout, aluout);
error = 1;
end
// genbit
op='b11; cin='b0; a='h00; b='h03;
#2 if({cout, aluout} != 9'h008) begin
$display($time, " FAILED %b %b %h %h %b %h", op, cin, a, b, cout, aluout);
error = 1;
end
op='b11; cin='b0; a='h00; b='h00;
#2 if({cout, aluout} != 9'h001) begin
$display($time, " FAILED %b %b %h %h %b %h", op, cin, a, b, cout, aluout);
error = 1;
end
/* tests are incomplete - doesn't compile yet on ivl */
if(error == 0)
$display("PASSED");
$finish;
end
endmodule
/*
* fragments of an ALU from an 8-bit micro
*/
module alu(Aval, Bval, cin, op, ALUout, cout);
input [7:0] Aval;
input [7:0] Bval;
input cin;
input [1:0] op;
output cout;
output [7:0] ALUout;
reg cout;
reg [7:0] ALUout;
always @(Aval or Bval or cin or op) begin
case(op)
2'b00 : {cout, ALUout} = Aval + Bval;
2'b10 : {cout, ALUout} = {1'b0, Aval & Bval};
// C++ compilation troubles with both of these:
2'b01 : {cout, ALUout} = 9'h100 ^ (Aval + Bval + 9'h001);
2'b11 : {cout, ALUout} = {1'b0, 8'b1 << Bval};
// 2'b01 : {cout, ALUout} = 9'h000;
// 2'b11 : {cout, ALUout} = 9'h000;
endcase
end // always @ (Aval or Bval or cin or op)
endmodule
/* Copyright (C) 1999 Stephen G. Tell
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA
*/