事先规划RTL结构
2017年07月18日 00:23:47
阅读数:343
目前成熟的EDA工具都是将RTL(寄存器传输级)层次的硬件描述语言转换为实际的电路。所谓RTL的含义就是D触发器之间穿插着组合逻辑。对于组合逻辑,我们只需描述它输入和输出的关系表达式(用if-else和case语句)不必深究到底用怎样的逻辑门来实现,而对于D触发器,则是一定要做到心中有数,就是哪些变量会生成D触发器。
举例来说,一个在CLK时钟驱动下,对输入信号IN进行上跳沿捕获的电路,其电路RTL结构如左图所示,它的Verilog代码如下所示,另外,EDA工具进行编译之后,会提取出RTL结构如右图所示,我们可以观察EDA工具解析出的RTL是否和我们预想的一致,这是一种重要的验证手段。对于Quartus工具,Tools -> Netlist Viewer -> RTL Viewer
顶层代码:
-
module liuyang(clk , in , out); -
input clk ; -
input in ; -
output out ; -
wire d1r; -
d1 d1_dut(.clk(clk) , .in(in) , .q1(d1r)); -
wire d2r; -
d2 d2_dut(.clk(clk) , .in(d1r) , .q2(d2r)); -
assign out = d1r && (~d2r) ; -
endmodule
触发器一:
-
module d1(clk , in , q1); -
input clk ; -
input in ; -
output reg q1 ; -
always @ (posedge clk ) -
begin -
q1 <= in ; -
end -
endmodule
触发器二:
-
module d2(clk , in , q2); -
input clk ; -
input in ; -
output reg q2 ; -
always @ (posedge clk ) -
begin -
q2 <= in ; -
end -
endmodule
RTL视图:
testbench:
-
`timescale 1ns/1ps -
module liuyang_tb; -
reg clk ; -
reg in ; -
wire out ; -
liuyang dut(.clk(clk) , .in(in) , .out(out)); -
initial begin -
clk = 1'b0 ; -
in = 1'b0 ; -
#200.1 -
in = 1'b1 ; -
#1000 -
in = 1'b0 ; -
#1000 -
in = 1'b1 ; -
end -
always #20 clk = ~clk ; -
endmodule
modelsim: