编写测试平台
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 82 课,共 90 课。
挑战
在本课中,你将创建一个测试平台,验证红绿灯控制器是否正常工作。
要做什么:
创建一个测试平台,其中:
- 声明信号(clk 和 reset 使用
reg,red、yellow、green 使用wire) - 实例化
traffic_light模块,并命名为uut - 生成一个每隔 1 个时间单位切换一次的时钟
- 施加复位 2 个时间单位,然后解除复位
- 运行仿真 100 个时间单位
仿真结果会根据打印内容进行检查,因此 initial 块还必须准确输出以下内容:
- 在设置时钟和复位之前,使用
$display打印Traffic Light Test - 经过 100 个时间单位后,使用
$display打印Test complete - 使用
$finish结束仿真,它会在输出中另外添加一行
亲手试试
module traffic_light (
input clk,
input reset,
output reg red,
output reg yellow,
output reg green
);
reg [1:0] state;
reg [5:0] counter;
// 输出赋值
always @(*) begin
case (state)
0: begin green = 1; yellow = 0; red = 0; end
1: begin green = 0; yellow = 1; red = 0; end
2: begin green = 0; yellow = 0; red = 1; end
default: begin green = 0; yellow = 0; red = 1; end
endcase
end
// 带计时功能的状态机
always @(posedge clk or posedge reset) begin
if (reset) begin
state <= 2;
counter <= 0;
end else begin
if (counter == 0) begin
case (state)
0: begin
state <= 1;
counter <= 10;
end
1: begin
state <= 2;
counter <= 40;
end
2: begin
state <= 0;
counter <= 30;
end
endcase
end else begin
counter <= counter - 1;
end
end
end
endmodule
module testbench;
// TODO: 为 clk 和 reset 声明 reg
// TODO: 为 red、yellow 和 green 声明 wire
// TODO: 实例化 traffic_light 模块,命名为 uut
// 连接 clk、reset、red、yellow 和 green
// TODO: 生成时钟(每隔 1 个时间单位翻转一次)
initial begin
$display("Traffic Light Test");
// TODO: 将 clk 初始化为 0
// TODO: 执行复位(reset=1 持续 2 个时间单位,然后 reset=0)
// TODO: 运行仿真 100 个时间单位
$display("Test complete");
$finish;
end
endmodule基础知识中的所有课
自己练习: Verilog 在线编译器