| `timescale 1ns/1ps |
| `default_nettype none |
| module test; |
| |
| localparam NUM_FF = 4; |
| |
| `include "../../../../library/tbassert.v" |
| |
| reg clk = 0; |
| reg rx = 1; |
| reg [13:0] sw = 0; |
| reg ce = 0; |
| reg sr = 0; |
| |
| wire tx; |
| wire [15:0] led; |
| |
| |
| // clock generation |
| always #1 clk=~clk; |
| |
| |
| top unt( |
| .clk(clk), |
| .rx(rx), |
| .tx(tx), |
| .sw({sr, ce, sw}), |
| .led(led) |
| ); |
| |
| wire [4*NUM_FF-1:0] D; |
| wire [NUM_FF-1:0] Q_vcc_gnd; |
| wire [NUM_FF-1:0] Q_s_gnd; |
| wire [NUM_FF-1:0] Q_s_s; |
| wire [NUM_FF-1:0] Q_vcc_s; |
| |
| assign Q_vcc_gnd[0] = led[0]; |
| assign Q_s_gnd[0] = led[1]; |
| assign Q_s_s[0] = led[2]; |
| assign Q_vcc_s[0] = led[3]; |
| assign Q_vcc_gnd[1] = led[4]; |
| assign Q_vcc_gnd[NUM_FF-1] = led[5]; |
| assign Q_s_gnd[NUM_FF-1] = led[6]; |
| assign Q_s_s[NUM_FF-1] = led[7]; |
| assign Q_vcc_s[NUM_FF-1] = led[8]; |
| |
| wire xorQ = led[9]; |
| wire orQ = led[10]; |
| wire andQ = led[11]; |
| |
| genvar i; |
| generate for(i = 0; i < NUM_FF; i=i+1) begin:ff |
| assign D[4*i+0] = sw[(4*i+0) % 14]; |
| assign D[4*i+1] = sw[(4*i+1) % 14]; |
| assign D[4*i+2] = sw[(4*i+2) % 14]; |
| assign D[4*i+3] = sw[(4*i+3) % 14]; |
| end endgenerate |
| |
| wire xorD = ^D; |
| wire orD = |D; |
| wire andD = &D; |
| |
| always begin |
| #1 |
| $monitor("1:%d %d %d %d %d %d %d %d %d %d %d %d %d", $time, clk, sw[14], led[0], led[1], led[2], led[3], led[9], xorD, led[10], orD, led[11], andD); |
| end |
| |
| initial begin |
| $dumpfile("testbench_ff_ce_sr_4_tb.vcd"); |
| $dumpvars; |
| #1.1 // 1 |
| tbassert(clk, "Clock!"); |
| tbassert(!Q_vcc_gnd[0], "!Q_vcc_gnd[0]"); |
| tbassert(!Q_s_gnd[0], "!Q_s_gnd[0]"); |
| tbassert(!Q_s_s[0], "!Q_s_s[0]"); |
| tbassert(!Q_vcc_s[0], "!Q_vcc_s[0]"); |
| tbassert(!xorQ, "^Q == 0"); |
| tbassert(!orQ, "|Q == 0"); |
| tbassert(!andQ, "&Q == 0"); |
| tbassert(xorQ == xorD, "^Q == xorD"); |
| // Test CE |
| #1 // 2 |
| tbassert(!clk, "Clock!"); |
| sw[0] = 1; |
| sw[1] = 1; |
| sw[2] = 1; |
| sw[3] = 1; |
| #1 // 3 |
| tbassert(Q_vcc_gnd[0], "Q_vcc_gnd[0]"); |
| tbassert(!Q_s_gnd[0], "!Q_s_gnd[0]"); |
| tbassert(!Q_s_s[0], "!Q_s_s[0]"); |
| tbassert(Q_vcc_s[0], "Q_vcc_s[0]"); |
| |
| tbassert(orQ, "|Q == 1"); |
| tbassert(!andQ, "&Q == 0"); |
| #1 // 4 |
| ce = 1; |
| #1 // 5 |
| tbassert(Q_vcc_gnd[0], "Q_vcc_gnd[0]"); |
| tbassert(Q_s_gnd[0], "Q_s_gnd[0]"); |
| tbassert(Q_s_s[0], "Q_s_s[0]"); |
| tbassert(Q_vcc_s[0], "Q_vcc_s[0]"); |
| |
| tbassert(xorQ == xorD, "^Q == xorD"); |
| tbassert(orQ, "|Q == 1"); |
| tbassert(!andQ, "&Q == 0"); |
| #1 // 6 |
| ce = 0; |
| sw[0] = 0; |
| sw[1] = 0; |
| sw[2] = 0; |
| sw[3] = 0; |
| #1 // 7 |
| tbassert(!Q_vcc_gnd[0], "!Q_vcc_gnd[0]"); |
| tbassert(Q_s_gnd[0], "Q_s_gnd[0]"); |
| tbassert(Q_s_s[0], "Q_s_s[0]"); |
| tbassert(!Q_vcc_s[0], "!Q_vcc_s[0]"); |
| |
| tbassert(orQ, "|Q == 1"); |
| tbassert(!andQ, "&Q == 0"); |
| #1 // 8 |
| ce = 1; |
| #1 // 9 |
| tbassert(!Q_vcc_gnd[0], "!Q_vcc_gnd[0]"); |
| tbassert(!Q_s_gnd[0], "!Q_s_gnd[0]"); |
| tbassert(!Q_s_s[0], "!Q_s_s[0]"); |
| tbassert(!Q_vcc_s[0], "!Q_vcc_s[0]"); |
| |
| tbassert(xorQ == xorD, "^Q == xorD"); |
| tbassert(!orQ, "|Q == 0"); |
| tbassert(!andQ, "&Q == 0"); |
| // Test SR |
| #1 // 10 |
| sw[0] = 1; |
| sw[1] = 1; |
| sw[2] = 1; |
| sw[3] = 1; |
| #1 // 11 |
| tbassert(Q_vcc_gnd[0], "Q_vcc_gnd[0]"); |
| tbassert(Q_s_gnd[0], "Q_s_gnd[0]"); |
| tbassert(Q_s_s[0], "Q_s_s[0]"); |
| tbassert(Q_vcc_s[0], "Q_vcc_s[0]"); |
| |
| tbassert(orQ, "|Q == 1"); |
| tbassert(!andQ, "&Q == 0"); |
| #1 // 12 |
| sr = 1; |
| #1 // 13 |
| tbassert(Q_vcc_gnd[0], "Q_vcc_gnd[0]"); |
| tbassert(Q_s_gnd[0], "Q_s_gnd[0]"); |
| tbassert(!Q_s_s[0], "!Q_s_s[0]"); |
| tbassert(!Q_vcc_s[0], "!Q_vcc_s[0]"); |
| |
| tbassert(xorQ == xorD, "^Q == xorD"); |
| tbassert(orQ, "|Q == 1"); |
| tbassert(!andQ, "&Q == 0"); |
| #1 // 14 |
| ce = 0; |
| sr = 0; |
| #1 // 15 |
| tbassert(Q_vcc_gnd[0], "Q_vcc_gnd[0]"); |
| tbassert(Q_s_gnd[0], "Q_s_gnd[0]"); |
| tbassert(!Q_s_s[0], "!Q_s_s[0]"); |
| tbassert(Q_vcc_s[0], "Q_vcc_s[0]"); |
| |
| tbassert(orQ, "|Q == 1"); |
| tbassert(!andQ, "&Q == 0"); |
| #1 // 16 |
| ce = 1; |
| #1 // 17 |
| tbassert(Q_vcc_gnd[0], "Q_vcc_gnd[0]"); |
| tbassert(Q_s_gnd[0], "Q_s_gnd[0]"); |
| tbassert(Q_s_s[0], "Q_s_s[0]"); |
| tbassert(Q_vcc_s[0], "Q_vcc_s[0]"); |
| |
| tbassert(xorQ == xorD, "^Q == xorD"); |
| tbassert(orQ, "|Q == 1"); |
| tbassert(!andQ, "&Q == 0"); |
| #1 // 18 |
| sw[13:0] = 14'b11_1111_1111_1111; |
| #1 // 19 |
| tbassert(Q_vcc_gnd[0], "Q_vcc_gnd[0]"); |
| tbassert(Q_s_gnd[0], "Q_s_gnd[0]"); |
| tbassert(Q_s_s[0], "Q_s_s[0]"); |
| tbassert(Q_vcc_s[0], "Q_vcc_s[0]"); |
| tbassert(Q_vcc_gnd[1], "Q_vcc_gnd[1]"); |
| tbassert(Q_vcc_gnd[NUM_FF-1], "Q_vcc_gnd[-1]"); |
| tbassert(Q_s_gnd[NUM_FF-1], "Q_s_gnd[-1]"); |
| tbassert(Q_s_s[NUM_FF-1], "Q_s_s[-1]"); |
| tbassert(Q_vcc_s[NUM_FF-1], "Q_vcc_s[-1]"); |
| |
| tbassert(xorQ == xorD, "^Q == xorD"); |
| tbassert(orQ, "|Q == 1"); |
| tbassert(andQ, "&Q == 1"); |
| #1 $finish; |
| end |
| |
| endmodule |