| /* |
| * land2 - a verilog test for logical and operator && in boolean context |
| * |
| * |
| * Copyright (C) 1999 Stephen G. Tell |
| * Portions inspired by qmark.v by Steven Wilson (stevew@home.com) |
| * Modified by SDW to self test. |
| * |
| * 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 |
| */ |
| |
| module land2; |
| |
| reg Clk; |
| reg a; |
| reg b; |
| reg c; |
| reg error; |
| |
| wire q; |
| wire q_calc; |
| |
| tand tand_m(q, q_calc, a, b, c); |
| |
| initial Clk = 0; |
| always #10 Clk = ~Clk; |
| |
| always @(posedge Clk) |
| begin |
| #1; |
| if(q != q_calc) |
| begin |
| $display("FAILED - expr && using %b%b%b is %b s/b %b", |
| a, b, c, q,q_calc); |
| error = 1; |
| end |
| end |
| |
| reg [3:0] bvec; |
| integer xa; |
| integer xb; |
| integer xc; |
| initial begin |
| bvec = 4'bzx10 ; |
| error = 0; |
| for(xa = 0; xa <= 3; xa = xa + 1) |
| for(xb = 0; xb <= 3; xb = xb + 1) |
| for(xc = 0; xc <= 3; xc = xc + 1) |
| begin |
| @(posedge Clk) |
| a = bvec[xa]; |
| b = bvec[xb]; |
| c = bvec[xc]; |
| end // for (var3 = 0; var3 <= 3; var3 = var3 + 1) |
| if(error == 0 ) $display("PASSED"); |
| $finish; |
| end |
| |
| endmodule |
| |
| module tand(q, q_calc, a, b, c); |
| output q; |
| output q_calc; |
| input a; |
| input b; |
| input c; |
| |
| wire q = ( (a===b) && (b===c) ); |
| reg q_calc; |
| |
| always @(a or b or c) |
| begin |
| if(a === b) |
| begin |
| if( b === c) |
| q_calc = 1'b1; |
| else |
| q_calc = 1'b0; |
| end |
| else |
| q_calc = 1'b0; |
| end |
| |
| endmodule // foo |