# [2021/05/27] 數位邏輯設計實習
## 上課小考

### testbench.cv
```
`timescale 1ns/1ns
module go();
reg Clk= 1'b0;
reg [3:0]D;
wire [3:0]Q_1,Q_ff;
parameter PERIOD = 400;
parameter real DUTY_CYCLE = 0.5;
parameter OFFSET = 100;
initial
begin
Clk = 1'b0;
#OFFSET;
forever
begin
Clk = 1'b1;
#(PERIOD-(PERIOD*DUTY_CYCLE)) Clk = 1'b0;
#(PERIOD*DUTY_CYCLE);
end
end
gogo uut(
.Clk(Clk),
.D(D),
.Q_1(Q_1),
.Q_ff(Q_ff)
);
initial
begin
D = 5;
#100
D = 12;
#100
D = 9;
#100
D = 1;
#100
D = 14;
#100
D = 7;
#100
D = 9;
#100
D = 10;
#100
D = 3;
#100
D = 6;
#100
D = 12;
#100
D = 1;
#100
D = 8;
#100
D = 0;
#100
D = 5;
#100
D = 12;
#100
D = 2;
#100
D = 3;
#100
D = 10;
#100
D = 5;
end
initial
begin
$display("Starting Testbench...");
#2000;
$finish();
end
initial
begin
$dumpfile("dump.vcd");
$dumpvars(0);
end
endmodule
```
### design.cv
```
module gogo(Clk,D,Q_1,Q_ff);
input Clk;
input [3:0]D;
output [3:0]Q_1,Q_ff;
reg [3:0]Q_1,Q_ff;
always@(Clk or D)
if(Clk)
Q_1=D;
always@(posedge Clk)
Q_ff=D;
endmodule
```
## 上課練習 [dff_1]
### testbench.sv
```
`timescale 1ns/1ns
module testbench();
reg Clk = 1'b0;
reg D = 1'b0;
reg Din = 1'b0;
reg Clr1 = 1'b1;
reg Clr2 = 1'b1;
reg Pre = 1'b0;
reg Load = 1'b0;
wire Q1;
wire Q2;
wire Q3;
wire Q4;
parameter PERIOD = 200;
parameter real DUTY_CYCLE = 0.5;
parameter OFFSET = 0;
initial // Clock process for Clk
begin
#OFFSET;
forever
begin
Clk = 1'b0;
#(PERIOD-(PERIOD*DUTY_CYCLE)) Clk = 1'b1;
#(PERIOD*DUTY_CYCLE);
end
end
dff_1 UUT (
.Clk(Clk),
.D(D),
.Din(Din),
.Clr1(Clr1),
.Clr2(Clr2),
.Pre(Pre),
.Load(Load),
.Q1(Q1),
.Q2(Q2),
.Q3(Q3),
.Q4(Q4));
initial
begin
// ------------- Current Time: 60ns
#60;
D = 1'b1;
Din = 1'b0;
// -------------------------------------
// ------------- Current Time: 260ns
#200;
D = 1'b0;
Din = 1'b1;
Clr1 = 1'b0;
Clr2 = 1'b0;
Pre = 1'b1;
// -------------------------------------
// ------------- Current Time: 460ns
#200;
D = 1'b1;
Din = 1'b0;
Load = 1'b1;
// -------------------------------------
// ------------- Current Time: 660ns
#200;
D = 1'b0;
Din = 1'b1;
// -------------------------------------
// ------------- Current Time: 860ns
#200;
D = 1'b1;
Din = 1'b0;
Pre = 1'b0;
// -------------------------------------
// ------------- Current Time: 1060ns
#200;
D = 1'b0;
Din = 1'b1;
Clr1 = 1'b1;
Clr2 = 1'b1;
Pre = 1'b1;
Load = 1'b0;
// -------------------------------------
// ------------- Current Time: 1260ns
#200;
D = 1'b1;
Din = 1'b0;
Clr1 = 1'b0;
Clr2 = 1'b0;
// -------------------------------------
// ------------- Current Time: 1460ns
#200;
D = 1'b0;
Din = 1'b1;
// -------------------------------------
end
initial
begin
$display("Starting Testbench...");
#1800;
$stop;
$finish();
end
initial
begin
$dumpfile("dump.vcd");
$dumpvars(0);
end
endmodule
```
### design.sv
```
// Code your design here
module dff_1(Clk, D, Din, Clr1, Clr2, Pre, Load, Q1, Q2, Q3, Q4);
input Clk, D, Din, Clr1, Clr2, Pre, Load;
output Q1, Q2, Q3, Q4;
reg Q1, Q2, Q3, Q4;
always@(posedge Clk)
Q1 = (Clr1 ? 0 : D);
always@(posedge Clk or posedge Clr2)
Q2 = (Clr2 ? 0 : D);
always@(negedge Clk or negedge Pre)
Q3 = (!Pre ? 1 : D);
always@(negedge Clk)
Q4 = (!Load ? Din : D);
endmodule
```