Quick Start
- 步骤1:准备环境。安装Vivado 2020.1及以上版本(或Quartus Prime 20.1),确保已安装对应器件库(如Xilinx Artix-7或Intel Cyclone V)。
- 步骤2:创建工程。新建RTL工程,目标器件设为XC7A35TICSG324-1L(Artix-7)或5CEBA4F23C7N(Cyclone V)。
- 步骤3:编写一个简单的计数器模块(8位)作为基线。使用两种风格:风格A(always @(posedge clk) + 非阻塞赋值)和风格B(组合逻辑+锁存器模拟)。
- 步骤4:对两种风格分别运行综合(Synthesis),并查看综合后的RTL网表(Schematic)。
- 步骤5:运行实现(Implementation),查看资源利用率(LUT、FF、DSP)和时序报告(WNS、TNS)。
- 步骤6:对比结果。风格A应使用1个FF和少量LUT,Fmax > 500 MHz;风格B可能使用多个LUT和锁存器,Fmax < 200 MHz。
- 步骤7:验证。在仿真中测试功能一致性(两种风格应输出相同计数序列)。
- 步骤8:记录日志。导出综合报告和实现报告,保存为CSV或文本,用于后续分析。
前置条件与环境
| 项目 | 推荐值 | 说明 | 替代方案 |
|---|---|---|---|
| 器件/板卡 | Xilinx Artix-7 XC7A35T | 大赛常用低成本器件,资源适中 | Intel Cyclone V / Lattice ECP5 |
| EDA版本 | Vivado 2020.1 | 稳定且兼容大赛环境 | Vivado 2018.3 / Quartus Prime 20.1 |
| 仿真器 | Vivado Simulator | 内建,无需额外安装 | ModelSim / Questa / Verilator |
| 时钟/复位 | 50 MHz 单端时钟,同步高有效复位 | 大赛典型配置 | 100 MHz / 异步复位 |
| 接口依赖 | 无外部接口 | 仅内部逻辑验证 | UART / SPI 用于调试 |
| 约束文件 | XDC(Vivado)或SDC(Quartus) | 必须包含时钟周期约束 | 自动推导(不推荐) |
| 操作系统 | Windows 10 64-bit | 兼容主流EDA | Ubuntu 18.04 / CentOS 7 |
目标与验收标准
完成本实验后,应能明确区分“良好”与“不良”Verilog代码风格对综合结果的影响。验收标准如下:
- 功能点:两种风格的计数器在仿真中输出相同序列(0–255循环)。
- 性能指标:风格A的Fmax ≥ 500 MHz(Artix-7 -1速度等级);风格B的Fmax ≤ 200 MHz或综合失败。
- 资源利用率:风格A使用1个FF和2–3个LUT;风格B使用4–6个LUT和1个锁存器(或更多)。
- 关键波形:风格A的时钟到输出延迟(Tco) 5 ns或存在毛刺。
- 日志验收:综合报告无严重警告(如“inferred latch”),实现报告无时序违例。
实施步骤
阶段1:工程结构与代码编写
创建两个独立RTL文件:counter_good.v 和 counter_bad.v。工程结构如下:
project/
├── rtl/
│ ├── counter_good.v
│ └── counter_bad.v
├── constr/
│ └── top.xdc
└── sim/
└── tb_counter.v风格A(良好):使用同步复位和always块。
// counter_good.v
module counter_good (
input wire clk,
input wire rst_n,
output reg [7:0] cnt
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= 8'd0;
else
cnt <= cnt + 1'b1;
end
endmodule风格B(不良):使用组合逻辑和锁存器模拟。
// counter_bad.v
module counter_bad (
input wire clk,
input wire rst_n,
output wire [7:0] cnt
);
reg [7:0] cnt_next;
always @(*) begin
if (!rst_n)
cnt_next = 8'd0;
else
cnt_next = cnt + 1'b1; // 注意:cnt是wire,这里会产生锁存器
end
assign cnt = cnt_next;
endmodule常见坑与排查:



