|
|
在Xilinx FPGA开发中,将Verilog代码转换为硬件原语的过程由Vivado综合工具自动完成。这一过程涉及多个步骤,下面详细解释其工作机制和用户可采取的查看方式:
1. 综合工具的映射机制
当你编写Verilog代码时,综合工具(如Vivado Synthesis)会按照以下方式将HDL描述转换为硬件原语:
预定义规则:Xilinx为常见的HDL模式定义了对应的原语映射规则。例如:
// Verilog代码
always @(posedge clk) begin
if (reset) q <= 1'b0;
else q <= d;
end
// 综合后映射为FDCE原语(带时钟使能和异步复位的触发器)
FDCE #(
.INIT(1'b0)
) u_fdce (
.C(clk),
.CE(1'b1),
.CLR(reset),
.D(d),
.Q(q)
);
资源优化:工具会根据目标FPGA架构选择最优原语。例如,LUT6原语可实现任意6输入逻辑函数,若代码中定义了一个复杂的布尔表达式,综合工具可能将其映射到LUT6。
约束影响:时序约束(如set_false_path)可能改变映射策略,优先保证关键路径性能。
2. 查看映射结果的方法
如果你想知道Verilog代码最终映射到了哪些原语,可以通过以下方式查看:
方法一:查看综合报告
在Vivado中运行综合(Run Synthesis)。
打开综合报告(Synthesis Report),查看“Utilization”部分,了解资源使用情况(如LUT、FF、BRAM的数量)。
在报告中搜索具体实例名,查看其对应的硬件资源。
方法二:查看网表文件
综合完成后,在Tcl控制台执行:
write_verilog -force -mode synth_stub [get_property DIRECTORY [current_run -impl]]/netlist_synth.v
打开生成的netlist_synth.v文件,其中包含了映射后的原语实例化代码。
方法三:使用Netlist Navigator
在Vivado中点击“Open Synthesized Design”。
选择“Netlist Navigator”,可以交互式查看设计的层次结构和原语映射。
方法四:查看时序报告
运行实现(Run Implementation)。
打开时序报告(Timing Report),查看路径延迟和涉及的原语。
3. 直接控制映射的方法
如果需要精确控制HDL到原语的映射,可以:
使用原语实例化:直接在代码中插入Xilinx原语(不推荐,除非必要)。
LUT6 #(
.INIT(64'hAAAA5555AAAA5555)
) u_lut (
.I0(a), .I1(b), .I2(c), .I3(d), .I4(e), .I5(f),
.O(out)
);
使用综合属性:通过(* attribute *)语法指导映射。
(* use_dsp48 = "yes" *)
assign result = a * b + c; // 强制使用DSP48E2原语
修改XDC约束:通过set_property命令调整映射策略。
set_property -dict {PACKAGE_PIN P12 IOSTANDARD LVCMOS33} [get_ports clk]
4. 常见映射示例
Verilog 代码
映射的原语
说明
assign out = a & b & c;
LUT3
3输入与门
always @(posedge clk)...
FDCE/FDPE
触发器
reg [15:0] mem [0:255];
RAMB18E2
块RAM
wire clk_buf;
BUFG bufg_inst (.I(clk), .O(clk_buf));
BUFG
全局时钟缓冲器(手动实例化)
5. 注意事项
工具依赖性:不同版本的Vivado可能有细微的映射差异。
资源利用率:过度使用原语可能导致资源浪费,优先使用HDL描述。
时序影响:直接使用原语可能绕过工具的时序优化,需谨慎使用。
文档参考:Xilinx UG901(Vivado Synthesis User Guide)详细说明了映射规则。
通过上述方法,你可以了解Verilog代码与硬件原语之间的映射关系,并在需要时进行精确控制。 |
|