作者:小白蒋
7年材料专业转行芯片验证,两年芯片验证工作经验。
题目:
描述:
用verilog实现两个串联的异步复位的T触发器的逻辑,结构如图:
## 波形示意图:
输入描述:
输入信号 data, clk, rst
类型 wire
在testbench中,clk为周期5ns的时钟,rst为低电平复位
输出描述:
输出信号 q
类型 reg
解答:
设计代码实现:
T触发器的特点:输入为1时,输出进行翻转。
在命令行敲入g tff.v
,复制下面代码,
`timescale 1ns/1ns
module Tff_2 (
input wire data, clk, rst,
output reg q
);
//*************code***********//
reg tmp;
always@(posedge clk or negedge rst) begin
if(~rst)
tmp <= 0;
else if(data)
tmp <= ~tmp;
else
tmp <= tmp;
end
always@(posedge clk or negedge rst) begin
if(~rst)
q <= 0;
else if(tmp)
q <= ~q;
else
q <= q;
end
//*************code***********//
endmodule
验证平台实现:
在命令行敲入g tff_tb.sv
,复制下面代码:
`timescale 1ns/1ps
module tb_top();
logic data,RST;
logic Q;
logic clk;
initial begin
#0;
clk = 1;
#20;
forever #50 clk = ~clk;
end
initial begin
data = 'h1;
RST = 1;
#50;
RST = 0;
#100;
RST = 1;
$display("At time:%t, Q:%h", $time, Q);
repeat(5) @(posedge clk);
data = 'h0;
$display("At time:%t, Q:%h", $time, Q);
repeat(3) @(posedge clk);
data = 'h1;
$display("At time:%t, Q:%h", $time, Q);
repeat(2) @(posedge clk);
$display("At time:%t, Q:%h", $time, Q);
$finish;
end
Tff_2 u0_TFF_2 (
.data(data),
.clk(clk),
.rst(RST),
.q(Q)
);
initial begin
$fsdbDumpfile("tb_top.fsdb");
$fsdbDumpvars(0, tb_top);
end
endmodule
makefile脚本实现:
在命令行敲入 g Makefile
#-----------------------------------------------------------
#// FileName: makefile
#// Creator: xiaobaijiang
#// time: 2022-04-21
#// wchat: jianfuk
#//-----------------------------------------------------------
run:
vcs -R -full64 +v2k -fsdb -sverilog tff.v tff_tb.sv -l run.log
verdi:
verdi -sv tff.v tff_tb.sv -ssf tb_top.fsdb &
clean:
@rm -rf verdiLog *.log *.fsdb csrc ucli.key simv* *.conf *.rc
仿真看波形:
在命令行输入make run
在命令行输入make verdi
看波形
更多芯片验证自学教程,请访问->传送门