verilog重音符号

在 Verilog/SystemVerilog 中,`````是重音符号(backtick,反引号),用于编译器指令、系统任务和常量。

1. 编译器指令(Compiler Directives)

复制代码
`define WIDTH 8          // 定义宏
`ifdef DEBUG            // 条件编译
  `include "debug.v"
`endif
`timescale 1ns/1ps      // 时间单位和精度

2. 系统任务和函数(System Tasks/Functions)

复制代码
`display("Hello");     // 显示信息
`finish;               // 结束仿真
`time                  // 当前仿真时间
`random               // 随机数

3. 特殊常量

复制代码
// 最常见的使用:'0, '1, 'x, 'z
reg [7:0] data = '0;     // 所有位设为 0
reg [7:0] all_ones = '1;  // 所有位设为 1
reg [7:0] unknown = 'x;   // 所有位设为 x(不定态)
reg [7:0] high_z = 'z;    // 所有位设为 z(高阻态)

// 会自动根据信号宽度填充
reg [31:0] data32 = '1;  // 32位全1
reg [15:0] data16 = '0;  // 16位全0

具体用法示例:

示例1:全0初始化

复制代码
// 传统写法
reg [31:0] data1 = 32'h0000_0000;
reg [15:0] data2 = 16'h0000;
reg [7:0]  data3 = 8'h00;

// 使用 '0 的简洁写法
reg [31:0] data1 = '0;  // 自动扩展为 32 位
reg [15:0] data2 = '0;  // 自动扩展为 16 位
reg [7:0]  data3 = '0;  // 自动扩展为 8 位

示例2:参数化代码

复制代码
module example #(
  parameter WIDTH = 32
)(
  input clk, rst,
  output reg [WIDTH-1:0] data
);

// 使用 '0 可以自动适应参数
always @(posedge clk) begin
  if (rst)
    data <= '0;  // 无论 WIDTH 是多少,都会正确清零
  else
    data <= data + 1;
end

endmodule

示例3:在赋值中使用

复制代码
// 将总线全部设为高阻
wire [7:0] data_bus = 'z;

// 默认值
logic [3:0] state = 'x;  // 初始为不定态

// 复位逻辑
always @(posedge clk) begin
  if (reset) begin
    counter <= '0;     // 计数器清零
    flags   <= '0;     // 标志位清零
    buffer  <= '0;     // 缓冲区清零
  end
end

与普通数字字面量的区别:

复制代码
// 普通数字字面量
reg [7:0] a = 0;     // 十进制0,实际是 8'b0000_0000
reg [7:0] b = 1;     // 十进制1,实际是 8'b0000_0001
reg [7:0] c = 8'hFF; // 明确的 8 位全1

// 使用 ' 符号
reg [7:0] d = '0;     // 自动填充为 8 位全0
reg [7:0] e = '1;     // 自动填充为 8 位全1
reg [7:0] f = 'x;     // 8 位全 x
reg [7:0] g = 'z;     // 8 位全 z

特殊符号表:

符号 含义 示例
'0 全0 reg [7:0] a = '0;8'b0000_0000
'1 全1 reg [7:0] a = '1;8'b1111_1111
'x'X 全不定态 reg [7:0] a = 'x;8'bxxxx_xxxx
'z'Z 全高阻态 reg [7:0] a = 'z;8'bzzzz_zzzz

注意事项:

  1. 只能用于赋值,不能用于比较:

    // 正确
    reg [7:0] data = '0;

    // 错误
    if (data == '0) begin // 不能这样比较

  2. 必须用单引号,不是双引号:

    reg [7:0] a = '0; // 正确
    reg [7:0] b = "0"; // 错误

  3. 在 case 语句中特殊用法

    case (data)
    '0: display("All zeros"); // 匹配全0 '1: display("All ones"); // 匹配全1
    'x: display("All unknown"); // 匹配全x default: display("Other");
    endcase

总结:

符号的主要作用是: 复制代码
1. **编译器指令** (`define,`ifdef 等)

2. **系统任务** (`display,`finish 等)

3. **特殊常量**(\`0, '1, 'x, 'z)用于自动位宽填充

在 RTL 代码中最常见的就是使用 `'0`来初始化或复位信号,这样代码更简洁且参数化友好。
相关推荐
坏孩子的诺亚方舟10 小时前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐16 小时前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐17 小时前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH2 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡2 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安2 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐3 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯3 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客3 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA3 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发