| /* 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 | |
| */ |