Verilog 的 ​结构级(Structural Level)​ 建模详解

Verilog 的 ​结构级(Structural Level)​ 建模是最接近实际硬件电路的抽象层次,通过实例化已有模块​(如逻辑门、寄存器或其他自定义模块)并连接它们的端口来构建系统。它类似于绘制电路原理图,强调模块的层次化组织和物理连接关系,适用于中大规模数字系统的模块化设计。


一、结构级建模的核心特点

  1. 模块化设计

    • 通过实例化子模块(如 AND、OR 门或自定义模块)组合成复杂电路。
    • 支持层次化设计(Top-Down/Bottom-Up),便于团队协作和复用。
  2. 明确硬件结构

    • 直接描述电路的实际组成(如门级网表)。
    • 所有连线(wire)和模块实例需显式定义。
  3. 适用场景

    • 基于现有 IP 核(如 PLL、存储器)的系统集成。
    • 门级网表实现(综合后的电路)。
    • 需要精确控制硬件结构的场景(如低功耗优化、时序约束)。

二、结构级建模语法与规则

1. ​模块实例化
  • 语法
    [模块名] [实例名] (
        .端口1(连线1),
        .端口2(连线2),
        ...
    );
  • 两种连接方式
    • 按顺序连接:端口顺序必须与模块定义一致。
      AND_gate U1 (a, b, y);  // 端口顺序:input a, input b, output y
    • 按名称连接:显式指定端口与连线的对应关系(推荐,避免顺序错误)。
      AND_gate U1 (
          .a(a), 
          .b(b), 
          .y(y)
      );
2. ​层次化设计
  • 子模块定义:先定义底层模块(如半加器),再在顶层模块中实例化。
  • 示例:全加器由两个半加器和一个或门组成。
    // 底层模块:半加器
    module HalfAdder (
        input  a, b,
        output sum, cout
    );
        assign sum = a ^ b;    // 异或
        assign cout = a & b;   // 与
    endmodule
    
    // 顶层模块:全加器(结构级)
    module FullAdder (
        input  a, b, cin,
        output sum, cout
    );
        wire s1, c1, c2;
    
        // 实例化两个半加器和一个或门
        HalfAdder HA1 (.a(a), .b(b), .sum(s1), .cout(c1));
        HalfAdder HA2 (.a(s1), .b(cin), .sum(sum), .cout(c2));
        OR_gate   OR1 (.a(c1), .b(c2), .y(cout));
    endmodule

三、结构级建模示例

1. ​4 位行波进位加法器
// 1 位全加器模块(假设已定义)
module FullAdder (input a, b, cin, output sum, cout);

// 4 位加法器(实例化 4 个全加器)
module RippleCarryAdder4bit (
    input  [3:0] a,
    input  [3:0] b,
    input        cin,
    output [3:0] sum,
    output       cout
);
    wire [3:0] c;  // 内部进位信号

    FullAdder FA0 (.a(a[0]), .b(b[0]), .cin(cin), .sum(sum[0]), .cout(c[0]));
    FullAdder FA1 (.a(a[1]), .b(b[1]), .cin(c[0]), .sum(sum[1]), .cout(c[1]));
    FullAdder FA2 (.a(a[2]), .b(b[2]), .cin(c[1]), .sum(sum[2]), .cout(c[2]));
    FullAdder FA3 (.a(a[3]), .b(b[3]), .cin(c[2]), .sum(sum[3]), .cout(cout));
endmodule
2. ​基于门电路的 2 选 1 多路选择器
module MUX2to1 (
    input a, b, sel,
    output y
);
    wire not_sel, and_a, and_b;

    // 实例化基本门电路
    NOT_gate U1 (.a(sel), .y(not_sel));
    AND_gate U2 (.a(a), .b(not_sel), .y(and_a));
    AND_gate U3 (.a(b), .b(sel), .y(and_b));
    OR_gate  U4 (.a(and_a), .b(and_b), .y(y));
endmodule

四、结构级 vs. 其他抽象层次

特性结构级数据流级行为级
抽象层次低(门级/模块连接)中(逻辑表达式)高(算法/状态)
核心语法模块实例化 + 端口连接assign 连续赋值always 块 + 过程赋值
可读性中(需理解模块间连接关系)高(直接逻辑)高(类似软件)
适用场景模块化设计、IP 核集成、门级网表组合逻辑设计复杂逻辑、状态机、时序逻辑

五、结构级建模注意事项

  1. 端口匹配

    • 实例化时端口数量、方向和位宽必须与模块定义一致。
    • 示例:若子模块输出为 output [3:0] data,实例化时需连接 4 位信号。
  2. 连线声明

    • 所有模块间的连接信号需显式定义为 wire(默认类型)或其他线网类型。
  3. 模块复用

    • 多次实例化同一模块时,需为每个实例分配唯一名称(如 AND_gate U1, U2;)。
  4. 延迟与时序

    • 结构级可指定门级延迟(仅用于仿真),如 AND_gate #(2) U1 (a, b, y); 表示 2 单位延迟。

六、总结

结构级建模是 Verilog 中最接近物理电路的描述方式,核心价值在于:

  • 模块化:通过实例化子模块构建复杂系统,支持团队协作和 IP 复用。
  • 精确控制:明确硬件结构,便于优化时序、功耗和面积(PPA)。
  • 综合友好:结构级代码通常可直接映射到目标工艺库(如 FPGA 或 ASIC 标准单元)。

适用场景

  • 基于标准单元库的门级设计。
  • 集成第三方 IP 核(如存储器、PLL)。
  • 需要精确描述电路结构的场合(如教学、反向工程)。

局限性

  • 代码冗长,不适合复杂算法或行为描述。
  • 对设计者的硬件知识要求较高。

掌握结构级建模后,可结合行为级和数据流级,实现从高层次抽象到低层次实现的全流程设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值