SystemVerilog 基础

数据类型:logic、reg、wire 的区别

理解 SystemVerilog 中 logic 类型如何统一并简化 Verilog 的 reg/wire 划分。

在 Verilog 中,信号必须严格区分为两类数据类型:

这个区分经常让初学者困惑:reg 不代表硬件寄存器,只是"由过程块赋值的变量"。

SystemVerilog 的 logic 类型

SystemVerilog 引入了 logic 类型来简化这一点。logic 可以像 reg 一样在过程块中赋值,也可以像 wire 一样被端口连接,只要它不是被多个驱动源同时驱动(即不能用于需要多重驱动的场景,比如三态总线,那种情况仍需使用 wire)。

module mux2 (
  input  logic sel,
  input  logic a,
  input  logic b,
  output logic y
);
 
  always_comb begin
    y = sel ? b : a;
  end
 
endmodule

上面的例子中,ylogic 类型,既是模块输出端口,又在 always_comb 块中被赋值——这在纯 Verilog 中是不允许的(端口只能用 wire 声明,除非显式用 reg 覆盖,且组合逻辑输出还需格外小心)。

什么时候仍然需要 wire

当一个信号需要被多个驱动源驱动(例如三态总线,多个模块共同驱动同一根线),必须使用 wire(或更明确的 wire 变体,如 tri),因为 logic 类型只允许单一驱动源,多重驱动会导致编译或仿真报错。

小结

以下哪种说法准确描述了 SystemVerilog 中的 logic 类型?

在需要多个模块共同驱动同一根三态总线时,应该使用哪种数据类型?(英文小写)