/// Sample Code for LSU EE 4702-1 Spring 2001 /// /// Population Modules and Testbench /// /// Input: a, an 8-bit vector. /// Output: pop, the number of 1's in a. /// Three descriptions: behavioral, implicit structural, and explicit structural. module pop_behavioral_8(pop,a); input a; output pop; wire [7:0] a; reg [3:0] pop; integer a_work, pop_work; // Executes whenever a changes. always @( a ) begin pop_work = 0; a_work = a; while( a_work ) begin pop_work = pop_work + a_work[0]; a_work = a_work >> 1; end // Note: pop changes once per change in a. pop = pop_work; end endmodule module pop_implicit_structural_8(pop,a); input a; output pop; wire [7:0] a; // Alas, there is no reduction addition operator. wire [3:0] pop = a[7] + a[6] + a[5] + a[4] + a[3] + a[2] + a[1] + a[0]; endmodule // pop_implicit_structural // And what if a is 128-bits? // (loop for i from 0 to 127 concat (format " + a[%d]" i)) module pop_explicit_structural_8(pop,a); input a; output pop; wire [7:0] a; wire [3:0] pop; wire [2:0] pop03, pop47; pop_explicit_structural_4 p03(pop03,a[3:0]); pop_explicit_structural_4 p47(pop47,a[7:4]); add_3 adder(pop[3],pop[2:0],pop03,pop47); endmodule // pop_explicit_structural_8 module pop_explicit_structural_4(pop,a); input a; output pop; wire [3:0] a; wire [2:0] pop; wire [1:0] pop03, pop47; bfa_structural bfa0(a0,a1,a[0],a[1],1'b0); bfa_structural bfa1(b0,b1,a[2],a[3],1'b0); bfa_structural bfa2(pop[0],cout0,a0,b0,1'b0); bfa_structural bfa3(pop[1],pop[2],a1,b1,cout0); endmodule // pop_explicit_structural_4 // // Binary Full Adder Explicit Structural Description // module bfa_structural(sum,cout,a,b,c); input a,b,c; output sum,cout; wire term001, term010, term100,term111; wire ab, bc, ac; wire na, nb, nc; or o1(sum,term001,term010,term100,term111); or o2(cout,ab,bc,ac); and a1(term001,na,nb,c); and a2(term010,na,b,nc); and a3(term100,a,nb,nc); and a4(term111,a,b,c); not n1(na,a); not n2(nb,b); not n3(nc,c); and a10(ab,a,b); and a11(bc,b,c); and a12(ac,a,c); endmodule module add_3(c_out,sum,a,b); input a, b; output c_out, sum; wire [2:0] a, b; wire c_out; wire [2:0] sum; bfa_structural bfa0(sum[0],cout1,a[0],b[0],1'b0); bfa_structural bfa1(sum[1],cout2,a[1],b[1],cout1); bfa_structural bfa2(sum[2],c_out,a[2],b[2],cout2); endmodule module test_pop(); wire [3:0] pb, pis, pes; integer i; wire [7:0] a = i[7:0]; integer check; pop_behavioral_8 p_b(pb,a); pop_implicit_structural_8 p_is(pis,a); pop_explicit_structural_8 p_es(pes,a); initial begin check = 0; for(i=0; i<256; i=i+1) begin #1; if( (^pb) === 1'bx ) begin $display("Behavioral has unknown value."); $stop; end check = check + pb; if( (^pis) === 1'bx ) begin $display("Implicit structural has unknown value."); $stop; end if( pis != pb ) begin $display("Implicit structural has wrong value."); $stop; end if( (^pes) === 1'bx ) begin $display("Explicit structural has unknown value."); $stop; end if( pes != pb ) begin $display("Explicit structural has wrong value."); $stop; end end // for (i=0; i<255; i=i+1) if( check != 256 * 4 ) begin $display("Incorrect check."); $stop; end $display("Passed all tests."); $stop; end endmodule