FPGA基础 -- Verilog 禁止语句

关于 Verilog 中"禁止语句"的详细培训讲解**,结合可综合设计与仿真行为的角度,深入讲解 Verilog 中的"禁止类语句"(即综合时应避免或仅用于仿真的语句):


一、Verilog 中的"禁止语句"概念

所谓"禁止语句"(或说非综合语句 ),是指 不能被综合工具(如 Vivado、Quartus、Synplify)综合到门级电路中,仅用于仿真或调试目的的语法结构。使用这些语句不会被转换为实际的逻辑门或触发器电路。

这些语句一般包括:

  • 延迟控制语句#
  • 系统任务与函数 (如 $display, $finish, $stop, $time
  • 初始化行为initial 块中不可综合的内容)
  • 文件操作 (如 $readmemh, $fopen, $fdisplay 等)

二、常见禁止语句汇总

类别 示例 用途 是否可综合
延迟控制 #10 a = 1'b1; 仿真中添加时间延迟 ❌ 禁止综合
时间函数 $time, $stime 获取当前仿真时间 ❌ 禁止综合
显示输出 $display, $monitor, $write 打印调试信息 ❌ 禁止综合
仿真控制 $stop, $finish 控制仿真结束 ❌ 禁止综合
文件操作 $readmemh, $fwrite, $readmemb 读取或写入文件数据 ❌ 禁止综合
initial中行为 initial a = 1'b0; 初始化变量(综合视角中不能使用) ❌ 一般禁止(除 LUT 初始化等特例)

三、为什么这些语句被禁止综合?

原因:

  1. 没有对应硬件结构 :比如 #10 是等待 10 单位时间,但实际硬件中没有"等待器"这种逻辑。
  2. 属于软件行为 :如 $display 是"调试信息打印",与硬件结构完全无关。
  3. 在综合工具中没有实现路径:工具会忽略或直接报错,无法映射为电路。

✅ 四、仿真专用 vs 综合可用

类型 说明 示例 建议
仿真专用语句 不用于硬件生成,仅供行为验证使用 $display, #10, $stop ✅ 用于 testbench 中
综合语句 可综合映射为门电路/触发器 always @(posedge clk), if, case, assign ✅ 用于设计模块
条件允许语句 在特定上下文可用 initial begin $readmemh(...) end ✅ 在初始化 BRAM 时使用

五、典型错误示例与修正建议

示例 1:使用 #10 延迟

verilog 复制代码
always @(posedge clk) begin
  #10 a = 1;  // ❌ 错误:不能综合
end

改为

verilog 复制代码
always @(posedge clk) begin
  a <= 1;  // 正确:同步逻辑
end

示例 2:使用 $display

verilog 复制代码
always @(posedge clk) begin
  if (a == 1) $display("a is 1");  // ❌ 错误:调试语句
end

改为(若要调试)

verilog 复制代码
// 在 testbench 文件中使用 $display,而不要在 RTL 代码中用

示例 3:初始化 ROM 内容

verilog 复制代码
reg [7:0] rom[0:255];
initial begin
  $readmemh("rom_init.hex", rom);  // ✅ 仅用于仿真或特殊综合支持(如 BRAM)
end

注意

  • Vivado 可以综合该 initial 行为并映射为初始化的 ROM。
  • 需要 readmemh 形式正确,ROM 不能是组合逻辑。

六、如何定位禁止语句?

综合工具一般会给出如下错误或警告提示:

  • Vivado: Cannot synthesize non-constant delay expression
  • Quartus: Unsupported system task or function
  • Synplify: Unsupported delay control #

建议做法:

  • 在 RTL 中使用严格的时序风格(同步时序 + 异步复位)
  • 所有调试、打印、文件操作,全部在 testbench 中完成
  • 利用 ifdef SYNTHESIS 屏蔽仿真语句

示例:

verilog 复制代码
`ifndef SYNTHESIS
    $display("Debug Message");
`endif

七、总结

内容分类 是否可综合 典型例子
行为级仿真语句 ❌ 不可综合 $display, #, $stop, initial a=1
初始化内存 有条件 ✅ $readmemh(ROM 初始化时)
可综合语句 always @(posedge clk), assign, case, if, FSM
相关推荐
XMAIPC_Robot3 小时前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
upper20204 小时前
从零开始设计riscv cpu记录之七
fpga开发·riscv·riscv设计·btb·分支预测
ARM|X86+FPGA工业主板厂家8 小时前
AI视觉跟随运动控制实战|RK3588 NPU检测+FPGA EtherCAT多轴联动精准跟随方案,适用于半导体视觉对位等
人工智能·fpga开发·硬件工程·ethercat·实时系统
XMAIPC_Robot12 小时前
RK3588+FPGA半导体设备量产踩坑大全|发热、时序漂移、推理抖动、成像干扰、EMC干扰方案
人工智能·嵌入式硬件·fpga开发·arm+fpga
凡亿卓达方案设计1 天前
FPGA硬件开发怎么选靠谱方案商?
fpga开发
Eloudy1 天前
QSFP28、RoCEv2、RFSoC-4x2 数据传输与器件链路
网络·fpga开发·rocev2
Echo_cy_1 天前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
現実君1 天前
关于MCU下位替换FPGA的经验与方案
单片机·嵌入式硬件·fpga开发
Terasic友晶科技1 天前
【教程】Agilex 5 SoC 的两种启动模式的开发演示(一)(FPGA Configuration First)
fpga开发·agilex 5 soc
ALINX技术博客1 天前
【黑金云课堂】FPGA技术教程Vitis开发:SD卡WAV文件读取音频播放实验
fpga开发·音视频