事先规划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: