数字IC设计全流程

DC运行流程1

DC-verdi-vcs-DVE

DC验证流程2

DC修改3

virtuoso加电源4

好的,我们把复杂的IC设计流程简化成一条清晰的“生产线”。

这是一个从 “代码概念”“物理电路” 的转化过程。

🚀 总流程图 (The Grand Map)

编写代码 (Verilog)

⬇️

逻辑综合 (Design Compiler) $\rightarrow$ 生成门级网表 (Netlist)

⬇️

时序验证 (Modelsim) $\rightarrow$ 确保逻辑对,延迟没问题

⬇️

电路生成 (Virtuoso) $\rightarrow$ 将网表自动转为原理图

⬇️

模拟仿真 (Spectre) $\rightarrow$ 看真实电压波形和延迟


👣 一步步详细拆解

我们要像这就开始第一步。

第一阶段:逻辑设计 (前端)

1. 写代码 (RTL Design)

  • 做什么: 打开文本编辑器,用 Verilog 写下 A * B 的公式。
  • 输入: 你的大脑。
  • 输出: mult32.v (源代码)。

2. 变电路 (Synthesis with DC)

  • 做什么: 把你的代码扔进 ​Design Compiler。告诉它:“用 SMIC 180nm 的工艺,给我造一个最快的乘法器!”

  • 发生什么: DC 会把你的 *​ 号变成几千个具体的 AND​、XOR 门电路。

  • 输出:

    • mult32_netlist.v​ (​这是核心文件,全是门电路连接)。
    • mult32.sdf (记录了每个门延迟了多少纳秒)。

3. 查逻辑 (Modelsim Verification)

  • 做什么:Modelsim 中,加载上面的网表和 SDF 文件。喂给它 10 * -5​,看输出是不是 -50
  • 目的: 确保 DC 综合出来的电路功能没算错。

第二阶段:电路实现 (后端)

4. 导电路 (Virtuoso Import)

  • 做什么: 打开 ​Virtuoso​,使用 File -> Import -> Verilog 功能。
  • 关键动作:mult32_netlist.v 喂给 Virtuoso。
  • 结果: 屏幕上自动生成了一张巨大的原理图 (Schematic),里面连好了几千根线。

5. 跑波形 (Spectre Simulation)

  • 做什么: 给这张原理图接上“虚拟电源(1.8V)”和“信号发生器”。
  • 看什么: 打开 ADE L 跑瞬态仿真。放大波形,看输出信号从 0​ 变成 正确结果 需要几纳秒 (这就是延时)。

📂 关键文件的“接力棒”

这个流程最容易乱的是文件。请记住这个文件的传递链:

  1. 创造了 mult32.v
  2. DC 读入 mult32.v​,产出 mult32_netlist.v​ 和 .sdf
  3. Modelsim 吃掉 mult32_netlist.v​ + .sdf 来验证。
  4. Virtuoso 吃掉 mult32_netlist.v 来画图。

准备好开始第一步了吗?

我们需要先写好那个最基础的 ​Verilog 代码 (mult32.v) 。你想直接要代码模板,还是我教你怎么写?


  1. DC运行流程

    1
    
    dc_shell -f run_syn.tcl | tee run_smic.log
    

    仿真配置5

    总结配置6

    1
    
    write -format verilog -hierarchy -output signed_vedic_mult_32bit_netlist.v
    

    VCS 仿真命令7

    数字全流程虚拟机8

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    # 1. 检查设计是否有逻辑问题
    check_design
    
    # 2. (可选) 设置一个简单的时钟约束,防止DC随意优化
    # 假设你的时钟端口叫 clk,目标频率是 100MHz (10ns)
    create_clock -period 10 [get_ports clk]
    
    # 3. 开始综合 (这是最关键的一步,把代码变成门电路)
    compile -map_effort medium
    # 或者使用更强的优化命令: compile_ultra
    
    # 4. 修改命名规则 (非常重要!)
    # DC生成的网表里可能会有反斜杠 \ 或方括号 [],VCS有时不喜欢,需要改名
    change_names -rules verilog -hierarchy
    
    # 5. 导出门级网表 (Netlist) -> 给 VCS 用
    write -format verilog -hierarchy -output signed_vedic_mult_32bit_netlist.v
    
    # 6. 导出标准延时文件 (SDF) -> 给 VCS 做时序仿真用
    write_sdf -version 2.1 signed_vedic_mult_32bit.sdf
    
    # 7. 导出约束文件 (SDC) -> 以后做布局布线 (P&R) 用
    write_sdc signed_vedic_mult_32bit.sdc
    
    1. read_file -format db /home/ic_libs/TSMC_013/synopsys/typical.db

      1. read_file -format db /home/ICer/project/synopsys/lib/tsmc018/osu018_stdcells.db
    2. list_libs

    3. check_library

    4. remove_design -designs


    这个库是后仿真用verilog库,dc综合后的网表仿真以及布局布线后网表仿真都用到它。一般随工艺库由foundry提供。举例来说,tower 0.18 工艺库,在主目录底下应该包含synopsys、astro等所用的库子目录。dc综合时用的工艺库应该包含在synopsys子目录下,同理,仿真用的verilog库应包含在名为verilog的子目录下,共包含2个文件,twr18.v 与 twr18_neg.v,其中后一个包含了负时序(- holdtiming)信息,但仿真速度较慢,一般不采用。在对综合或布局布线后网表进行仿真时将这个.v文件与所得的sdf或者spef文件一起载入仿真器仿真即可。当然,不同的foundry提供的工艺库目录结构可能略有不同,但基本上遵循上述的目录结构。楼主请到相应的库目录下查找一下即可。


    问题

    1. 改变电压和输出芯片没变化,在亚阈值区
    2. 怎么用向量测试
    3. 我觉得还是先进行第二步,用modelsim看时序,写测试逻辑在所
    4. 如何把32位乘法器模块化设计的更好些

    翻译加e入9

    转换库10

    网表 (Netlist) 是由 Design Compiler (DC) 在运行完 compile 命令之后生成的。

    在你的脚本 run.tcl​ 中,它是由 write 这个命令产生的。

    1. 网表在哪里生成? (Where)

    在你提供的 run.tcl 文件末尾,有一行:

    write -format ddc -hier -out unmapped/MY_DESIGN.ddc

    ⚠️ 注意: 这行生成的是 .ddc​ 文件(二进制数据库),只能给 DC 自己读,Modelsim 和 Virtuoso 读不懂!

    你需要手动添加下面这一行命令到 run.tcl​ 的最后(在 exit 之前),才能生成通用的 Verilog 网表:

    Tcl

    1
    2
    
    # 必须添加这一行来生成 .v 文件
    write -format verilog -hierarchy -output mult32_netlist.v
    
    • 生成的时机: 必须在 compile​ 命令之后执行。
    • 生成的位置: 会出现在你运行 DC 的当前文件夹下,名字叫 mult32_netlist.v

    2. 网表的格式是怎样的? (Format)

    网表虽然也是 .v​ 文件,但它和你要自己写的 mult32.v 长得完全不一样。

    • 你的代码 (RTL): 描述的是“功能” (人类能看懂)。
    • 网表 (Netlist): 描述的是“连接关系” (机器能看懂)。

    举个例子对比:

    A. 你写的代码 (Behavioral RTL):

    Verilog

    1
    2
    3
    4
    5
    6
    
    module mult32 (A, B, P);
        input [31:0] A, B;
        output [63:0] P;
    
        assign P = A * B;  // 一句话搞定
    endmodule
    

    B. DC 生成的网表 (Gate-level Netlist):

    (这就是 mult32_netlist.v 里的内容,DC 把你的乘号打碎成了几千个门)

    Verilog

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    module mult32 ( A, B, P );
      input [31:0] A;
      input [31:0] B;
      output [63:0] P;
          
      // 1. 定义了一堆乱七八糟的中间连线
      wire n1, n2, n3, n45, n_sys_12, net_334;
    
      // 2. 调用工艺库里的“标准单元” (Standard Cells)
      // AND2X1, XOR2X1 这些名字来自你的 SMIC .18 库
      AND2X1 U1 ( .A(A[0]), .B(B[0]), .Y(n1) );
      AND2X1 U2 ( .A(A[1]), .B(B[0]), .Y(n2) );
          
      // 3. 具体的连接关系
      XOR2X1 U3 ( .A(n1), .B(n_sys_12), .Y(P[0]) );
      INVX1  U4 ( .A(n45), .Y(net_334) );
          
      // ... 下面还有几千行这样的东西 ...
    endmodule
    

    3. 如何检查网表是否正确?

    当你打开生成的 mult32_netlist.v 文件时:

    1. 看名字: 里面的模块名(比如 AND2X1​、FAX1​)必须是 SMIC .18 工艺库里的名字。如果看到 GTECH_AND 这种名字,说明综合没完全成功(没映射到具体工艺上)。
    2. 看结构: 里面不应该再出现 assign P = A * B; 这种语句。
    3. 看端口: 模块的输入输出端口(A​, B​, P)应该和你原始设计保持一致。

    下一步操作建议:

    修改你的 run.tcl,加上 write -format verilog … 那行代码,重新运行一遍 DC,然后去文件夹里找生成的 .v 文件。

    ‍ ↩︎

  2. DC验证流程

    做数字IC设计,DC综合后的验证通常被称为门级仿真 (Gate-Level Simulation, GLS) 或 ​后仿真 (Post-Sim)

    它的目的是验证 DC 生成的“网表”是否与你原来的 RTL 功能一致,以及时序是否满足要求。

    在这个虚拟机里,你主要使用 VCS (负责跑仿真) 和 Verdi (负责看波形)。以下是手把手的操作流程:

    第一步:准备文件 (在 DC 中生成)

    在 DC (Design Compiler) 中综合完成后,你必须保存两个关键文件,否则无法进行后续验证:

    1. 门级网表 (.v): 这是把你的代码变成了用 TSMC 库里的 AND, OR, XOR 门连接的电路。
    2. 标准延时文件 (.sdf): (可选,做带时序的后仿需要) 包含了每个门的真实延迟信息。

    第二步:修改 Testbench (测试平台)

    你需要对原来的 Testbench 做一点点修改,让它能加载延迟文件(如果你只做逻辑验证,不关心延迟,可以跳过 initial 块里的代码)。

    打开你的 tb_adder_32.v,加入以下内容:

    Verilog

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    module tb_adder_32;
        // ... 你的信号定义 ...
    
        // 实例化你的设计 (注意:这里实例化的是 DC 生成的网表模块名)
        adder_32 u_adder_32 ( ... ); 
    
        initial begin
            // 【关键】加载波形记录功能 (为了给 Verdi )
            $fsdbDumpfile("adder_post_sim.fsdb");
            $fsdbDumpvars(0, tb_adder_32);
    
            // 【关键】反标 SDF 延迟文件 (如果要看真实延迟)
            // 第一个参数是sdf文件路径,第二个是Testbench里例化的DUT名字
            $sdf_annotate("adder_32.sdf", u_adder_32); 
        end
            
        // ... 你的测试激励 ...
    endmodule
    

    第三步:运行 VCS 仿真 (核心步骤)

    这是最关键的一步。你需要告诉 VCS:我要仿真网表、我的 Testbench、以及​厂家给的门电路仿真模型

    在终端中输入以下命令(假设你在当前目录下):

    Bash

    1
    2
    3
    4
    5
    
    vcs -R -full64 -debug_access+all \
        tb_adder_32.v \
        adder_32_netlist.v \
        -v /你的库文件路径/verilog/tsmc13.v \
        +neg_tchk +maxdelays
    

    命令详解 (必须看):

    • -R: 编译后立即运行。
    • -full64: 使用 64 位模式。
    • -debug_access+all​: 开启调试模式,​否则无法生成 fsdb 波形给 Verdi 看
    • tb_adder_32.v: 你的测试平台。
    • adder_32_netlist.v: DC 吐出来的网表。
    • -v /.../verilog/tsmc13.v​: 这是最重要的! 网表里全是 XOR2X1​ 这种名字,VCS 不认识,必须指向你截图里的那个 tsmc13.v 文件,它里面定义了这些门的逻辑行为。
    • +neg_tchk: 后仿常见选项,防止因负的时间检查导致仿真报错。

    第四步:使用 Verdi 查看波形

    如果 VCS 运行成功,你会看到终端打印出仿真时间,并且目录下会生成一个 adder_post_sim.fsdb 文件。

    现在打开 Verdi 来看波形和电路图:

    方法 1:直接加载波形

    Bash

    1
    
    verdi -ssf adder_post_sim.fsdb &
    

    方法 2:加载设计和波形 (推荐,可以看门级电路图)

    Bash

    1
    
    verdi -sv tb_adder_32.v adder_32_netlist.v -v /你的库文件路径/verilog/tsmc13.v -ssf adder_post_sim.fsdb &
    

    打开后:

    1. g 键(Get Signals)把信号拉出来。
    2. 你会发现波形不再是完美的方形,信号变化会有微小的​延迟(如果你加载了 SDF),这就是后仿真的意义!
    3. 你可以双击代码窗口里的模块,查看 DC 综合出来的真实门电路连接图(不再是 RTL 代码,而是 Schematic)。

    总结

    1. DC -> 吐出 netlist.v​ 和 .sdf
    2. Testbench -> 加 $sdf_annotate​ 和 $fsdbDump
    3. VCS -> 编译 TB + Netlist + tsmc13.v
    4. Verdi -> 看 .fsdb 波形。
     ↩︎
  3. DC修改

    这三个文件正好代表了 Design Compiler (DC) 工作的 “指挥”、“规则”和“记录” 三个核心层面。对于你的 32 位乘法器设计,理解这三个文件的关系非常关键。

    以下是详细的通俗解释:

    1. run.tcl —— 总指挥 (Flow Script)

    这是你需要“喂”给 DC 的​主脚本。它告诉 DC 按什么顺序干活。

    • 作用: 自动化整个综合流程。你不需要一行行敲命令,运行这个脚本,DC 就会自动做完所有事。

    • 代码解读:

      • read_db sc_max.db​: ​准备工具。读取工艺库(比如你的 SMIC .18 库)。
      • read_verilog my_design.v​: ​读取图纸。读入你的 Verilog 代码。
      • source ... lab4.con​: ​读取规则。加载下面的约束文件,告诉 DC 你的性能要求。
      • write_script ... lab4.wscr​: ​保存现场​。把当前 DC 理解的所有设置保存成一个新脚本(即下面的 lab4.wscr)。
      • write -format ddc ...​: ​保存结果​。保存综合后的数据库文件 (.ddc)。

    对你的意义: 你需要编写一个类似的脚本(或者修改这个),把里面的 my_design.v​ 改成你的 mult32.v,把库文件改成你的 SMIC 库路径。

    2. lab4.con —— 规则书 (Constraints File)

    这是最重要的文件,通常由设计师(你)亲手编写。它定义了电路必须满足的“KPI 指标”。

    • 作用: 告诉 DC:“我要跑多快(频率)”、“输入信号来得有多晚”、“输出信号要送多远”。

    • 代码解读:

      • create_clock -period 3.0 [get_ports clk]​: 时钟定义 。定义时钟周期为 3.0ns(即 333MHz)。对于你的组合逻辑乘法器,这里主要用于设定虚拟时钟来限制最大延迟。
      • set_clock_uncertainty ...​: 时钟抖动 。预留一些时间余量给时钟的不稳定性(Jitter)。
      • set_input_delay ...​: 输入延时 。告诉 DC 外部信号不是立刻到的,比如 data* 端口信号会在时钟沿后 0.45ns 才到达。
      • set_output_delay ...​: 输出延时 。告诉 DC 输出信号必须在下一级电路需要之前多久准备好。
      • set_max_area 540​: 面积约束 。限制电路的最大面积不能超过 540 个单位。

    对你的意义: 你的 32 位乘法器是一个纯组合逻辑(假设没有流水线),你需要用 set_max_delay​ 或者定义一个虚拟时钟 (create_clock -period ...​) 配合 set_input/output_delay 来限制从 A/B 到 P 的运算时间。

    3. lab4.wscr —— 现场记录 (Write Script / Echo Script)

    这是一个由 DC 自动生成的文件(在 run.tcl​ 里由 write_script​ 命令生成),通常​不需要你写

    • 作用: 它是 DC “消化”完你的约束(lab4.con​)后,吐出来的“理解报告”。它把所有的通配符(比如 data*​)都展开成了具体的每一根线(比如 data1[4]​, data1[3]…)。

    • 为什么不一样?

      • lab4.con​ 是给人写的,为了方便用了 data* 这种简写。
      • lab4.wscr​ 是机器生成的,它必须精确到每一位,所以看起来非常啰嗦,列出了 Cin2[2]​ 、out3[4] 等所有端口的具体约束。
    • 用途: 主要用于​调试。如果你发现综合结果不对,可以打开这个文件,看看 DC 是否真的把约束加到了每一根线上。

    对你的意义: 暂时忽略它。你只需要关注如何写好 .con​ 文件,.wscr 只是一个结果验证文件。


    总结:你的 32 位乘法器该怎么用这三个文件?

    1. 复制并修改 run.tcl

      • read_verilog 后面的文件换成你的乘法器代码。
      • source 后面的文件换成你新建的约束文件。
    2. 参考 lab4.con编写 mult32.con

      • 这是你需要花精力的地方。
      • 对于组合逻辑乘法器,你的 .con​ 文件可以写得比 lab4.con 简单:

    1
    2
    3
    4
    5
    6
    7
    
    # 定义一个虚拟时钟,假设我们要跑 100MHz (10ns)
    create_clock -period 10 -name v_clk
    # 设定输入输出延迟,强迫 DC 优化路径
    set_input_delay -max 0 -clock v_clk [all_inputs]
    set_output_delay -max 0 -clock v_clk [all_outputs]
    # 或者直接用组合逻辑最大延迟约束
    set_max_delay 10 -from [all_inputs] -to [all_outputs]
    
    1. 运行: 在 DC 命令行输入 source run.tcl,然后坐等结果。
     ↩︎
  4. virtuoso加电源

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    procedure( LOL_Run_Wire_Stub_Fix( libName )
        let( (lib cv mPt pt stubPt line netName)
            lib = ddGetObj( libName )
            if( lib then
                printf( "--- Processing Library: %s ---\n" libName )
                foreach( cell lib~>cells
                    ; Try to open schematic
                    cv = dbOpenCellViewByType( libName cell~>name "schematic" "" "a" )
                        
                    when( cv
                        printf( "  > Fixing: %s\n" cell~>name )
                            
                        foreach( inst cv~>instances
                            foreach( iTerm inst~>instTerms
                                ; Filter for vdd or gnd pins
                                when( member( iTerm~>name '("vdd" "gnd") )
                                    foreach( pin iTerm~>term~>pins
                                        foreach( fig pin~>figs
                                            ; 1. Calculate Coordinate
                                            mPt = centerBox( fig~>bBox )
                                            pt = dbTransformPoint( mPt inst~>transform )
                                                
                                            ; 2. Define Direction
                                            if( iTerm~>name == "vdd" then
                                                netName = "vdd!"
                                                stubPt = list( car(pt) cadr(pt)+0.15 )
                                            else
                                                netName = "gnd!"
                                                stubPt = list( car(pt) cadr(pt)-0.15 )
                                            )
                                                
                                            ; 3. Draw Wire Stub (Layer: wire drawing)
                                            line = dbCreateLine( cv list("wire" "drawing") list(pt stubPt) )
                                                
                                            ; 4. Add Label to Wire
                                            when( line
                                                schCreateWireLabel( cv line stubPt netName "centerCenter" "R0" "stick" 0.05 nil )
                                            )
                                        )
                                    )
                                )
                            )
                        )
                            
                        ; Finalize
                        schCheck( cv )
                        dbSave( cv )
                        dbClose( cv )
                    )
                )
                printf( "--- SUCCESS: All schematics updated ---\n" )
            else
                printf( "ERROR: Library %s not found!\n" libName )
            )
        )
    )
    

    1
    
    load( "/root/Desktop/fix_final.il" )
    

    1
    
    LOL_Run_Wire_Stub_Fix( "freepdk45_cellsBARK" )
    
     ↩︎
  5. 仿真配置

    1
    2
    3
    4
    5
    
    vcs -R -full64 -debug_access+all \
        tb_mult.v \
        signed_vedic_mult_32bit_netlist.v \
        -v /home/ICer/EDA/verilog/tsmc13.v \
        +neg_tchk +maxdelays
    

    . 关于 “Fatal: Error loading environment variables…”

    你 Log 的最后出现了这个严重错误:

    驱动能力 5V

    Plaintext

    1
    2
    
    Fatal: Error loading environment variables from environment file.
    Terminating execution.
    

    这意味着你的仿真环境配置(AMS Designer)挂了。

    • 影响​:如果你只是画图、跑 LVS/DRC,这可能暂时不影响你使用。但如果你要进行 ​数模混合仿真 (AMS Simulation) ,工具会无法启动。

    • 原因​:通常是因为你的 Linux 环境变量配置有问题,或者工程目录下的 .cdsinit​ / ams.env 文件里指向的路径不对。

    • 建议

      • 如果 Virtuoso 没有闪退,可以先忽略它,专注解决上面的黄色框问题。
      • 如果后续跑仿真报错,建议联系实验室负责服务器的同学,检查一下 AMS_DIR 或相关的环境变量设置
     ↩︎
  6. 总结配置

    1. DC用sdl
    2. 需要配置symbol(没的话仿真不了)和schematic(重要)
    3. 网表要对应
    4. 模型库11

    ‍ ↩︎

  7. VCS 仿真命令

    1
    2
    3
    4
    5
    6
    7
    8
    
    vcs -R -full64 \
      -debug_acc+all -debug_region+cell+encrypt \
      -timescale=1ns/1ps \
      +v2k \
      tsmc13.v \
      signed_vedic_mult_32bit_netlist.v \
      signed_vedic_mult_32bit_tb.v \
      -l func_sim.log
    

    dve -vpd inter.vpd

    注意:这次运行后,你应该会看到生成了一个稍微大一点的 inter.vpd​ 或 vcdplus.vpd 文件。

    vcdplus.vpd

    dve -vcdplus.vpd

    ./simv -gui &

    run

    如果你做后端或验证,通常会用 Verdi 来查看网表,它的原理图追踪功能比 Design Vision 强大得多。

    看图

    1
    
    verdi -sv signed_vedic_mult_32bit_netlist.v tsmc13.v &
    
     ↩︎
  8. 数字全流程虚拟机

    这是一个非常“豪华”且专业的IC设计环境(通常被称为EDA虚拟机),几乎涵盖了数字IC设计(前端、后端)、模拟IC设计以及FPGA开发的整个全流程工具。

    对于你的微电子科学与工程专业背景,这个环境非常适合学习和做项目。

    以下是根据你提供的目录截图整理的工具清单及其作用,以及关于替代ModelSim的回答:

    1. 能替代 ModelSim 的数字仿真工具

    你问有没有能替代 ModelSim 的工具,答案是:有,而且更强大、更符合工业界标准。

    在这个虚拟机中,你有三个顶级的工业级仿真器,它们在性能和功能上都超越了普通的 ModelSim:

    • vcs(Synopsys VCS):

      • 地位: 业界最主流的数字逻辑仿真器之一(通常与 Verdi 配合使用)。
      • 特点: 它是编译型仿真器(Compile-based),速度比 ModelSim(解释型)快得多,尤其是在大规模设计时。
      • 用法: 配合 Verdi 查看波形是数字IC设计工程师的标准工作流(不再是像 ModelSim 那样看自带的波形窗口)。
    • questasim(Mentor Questasim):

      • 地位: 它是 ModelSim 的“大哥”或“高级版”。
      • 特点: 界面和操作逻辑与 ModelSim 几乎一模一样,但支持更多的高级验证特性(如 SystemVerilog 断言、UVM 方法学等),且仿真速度更快。如果你习惯了 ModelSim,上手这个是零门槛的。
    • INCISIVE(Cadence Incisive / IES):

      • 地位: Cadence 家的数字仿真平台(命令通常是 ncsim​ 或 irun)。
      • 特点: 同样是工业级强力仿真工具,常用于混合信号仿真(配合 Virtuoso)。

    建议: 作为微电子专业的学生,建议你尽早开始学习使用 VCS + Verdi 的组合,这是目前数字后端和验证岗位最核心的技能之一。


    2. 虚拟机内其他工具详细介绍

    我们将这些工具按照厂商和用途分类:

    A. Synopsys 系列 (数字IC设计的核心力量)

    截图路径:synopsys 目录下

    • vcs/ vcs-mx: 数字逻辑仿真器(前面已提)。
    • verdi:最强大的波形查看与调试工具。它不产生波形,而是读取 VCS 跑出来的波形文件(.fsdb),用于追踪信号、查看原理图逻辑,是数字工程师每天都要用的神器。
    • syn(Design Compiler - DC):逻辑综合工具。将你写的 Verilog RTL 代码转换成门级网表(Gate-level Netlist)。这是数字前端设计最重要的工具。
    • icc2(IC Compiler II):数字后端布局布线工具 (P&R) 。用于将综合后的网表变成实际的版图(Layout)。
    • pts(PrimeTime - PT):静态时序分析工具 (STA) 。用于检查芯片能否在指定频率下稳定工作,是Sign-off(签核)的金标准。
    • SpyGlass:RTL 检查工具。用于在综合之前检查你的代码风格、跨时钟域(CDC)问题等,防止低级错误。
    • lc(Library Compiler): 库文件处理工具,用于将 .lib 转为 .db 格式供 DC 使用。

    B. Cadence 系列 (模拟/数模混合设计霸主)

    截图路径:cadence 目录下

    • IC617(Virtuoso):模拟/混合信号版图与原理图设计工具。画 MOS 管、画版图、做 DRC/LVS 都要用到它。微电子学生应该非常熟悉这个界面。
    • MMSIM151(Spectre):模拟电路仿真器。在 Virtuoso 里跑仿真(AC/DC/Tran)时,后台调用的就是它。
    • INCISIVE152: 数字仿真平台(前面已提)。

    C. Mentor (现 Siemens EDA) 系列

    截图路径:mentor 目录下

    • Calibre2015:物理验证金标准。用于做 DRC(设计规则检查)、LVS(版图原理图一致性检查)和 PEX(寄生参数提取)。在 Virtuoso 画完版图后,必须用 Calibre 跑一遍才算完成。
    • questasim: 高级数字仿真器(前面已提)。

    D. Xilinx 系列 (FPGA 开发)

    截图路径:Xilinx 目录下

    • Vivado 2019.1: Xilinx 的 FPGA 集成开发环境。包含综合、布局布线和仿真。
    • SDK: 嵌入式软件开发工具(通常用于 Zynq 系列里的 ARM 核开发)。

    E. 开源/轻量级工具

    • iverilog(Icarus Verilog): 开源的 Verilog 仿真器,轻量级,适合简单测试。
    • gtkwave: 开源的波形查看器,通常配合 iverilog 使用。
    • Riscv_Tools: 专门用于 RISC-V 处理器开发的工具链(编译器 gcc 等)。

    总结

    这个虚拟机环境非常完善:

    1. 做数字IC: 你有 VCS (仿真) + Verdi (调试) + DC (综合) + ICC2 (后端) + PrimeTime (时序)。
    2. 做模拟IC: 你有 Virtuoso (设计) + Spectre (仿真) + Calibre (验证)。
    3. 做FPGA: 你有 Vivado。

    对于你的“替代 ModelSim”的需求,直接去 synopsys目录下找 vcs,或者在终端里配置好环境变量后尝试运行 vcs verdi即可。 ↩︎

  9. 翻译加入

    要在 Virtuoso (IC617) 中使用这个库,你需要把它“挂载”到 Library Manager 中。

    根据你提供的截图,你已经在 osu_soc-master/cadence/lib/tsmc018 路径下找到了库文件夹。

    请按照以下步骤操作:

    第一步:确认 Linux 路径

    非常重要: 你的截图 显示的是 Windows 路径 (D:\Virtual_share…)。

    Virtuoso 运行在 Linux 中,它读不到 D 盘。你需要找到这个“共享文件夹”在 Linux 里的挂载路径。

    • 通常是在 /mnt/hgfs/Virtual_share/​ 或者 /media/sf_Virtual_share/ 下。
    • 你需要定位到 Linux 下的这个文件夹:.../osu_soc-master/cadence/lib/tsmc018/OSU_stdcells_tsmc018

    第二步:在 Library Manager 中添加库

    1. 打开 Virtuoso 的 Library Manager (库管理器)。

    2. 在顶部菜单栏点击 Edit -> ​Library Path…

    3. 这会弹出一个表格编辑器。在最下面的一行空白处填写:

      • Library (库名): OSU_stdcells (或者你自己喜欢的名字,只要记住就行)。
      • Path (路径): 点击单元格里的浏览按钮,找到上面提到的 Linux 路径,选中 OSU_stdcells_tsmc018 这个文件夹。
      • (注意:要选那个文件夹本身,不要进去了)
    4. 点击 File -> Save (保存 cds.lib),然后关闭编辑窗口。

    第三步:验证库是否有效

    1. 回到 Library Manager 主界面。

    2. 在左侧 Library 列表里,应该能看到你刚加的 OSU_stdcells

    3. 点击它,看中间的 Cell 列表:

      • 情况 A (成功): 如果你看到全是 AND2X1​, DFF​, INV 等名字,恭喜你,挂载成功!
      • 情况 B (空库): 如果里面是空的,或者 Virtuoso 报错说格式不对(OpenAccess版本问题),说明这个文件夹里的数据是旧版格式或者只是个空壳。如果遇到这种情况,请看下面的“Plan B”。

    第四步:回到 Verilog In 界面 (解决你的最初问题)

    一旦第三步确认成功,你就可以回到“Verilog In”导入界面 进行修改了:

    1. Target Library Name: 建议填 my_design (你自己新建的库)。
    2. Reference Libraries: 这里填写:
      OSU_stdcells basic analogLib
      (注意:OSU_stdcells 必须和你第二步里起的 Library 名字一模一样)

    Plan B:如果直接挂载全是空的 (使用 GDS 导入)

    OSU 的这个包有时候库文件不完整,但它一定提供了 GDSII 版图文件。如果上面的方法不行,请用这个方法“重建”库:

    1. 新建库: Library Manager -> File -> New -> Library。

      • 名字:OSU_stdcells
      • Technology File: 选择 Attach to an existing technology library​ -> 选择 NCSU_TechLib_tsmc02​ (或者是 tsmc03,如果没有就选 Do not need process info)。
    2. 导入 GDS:

      • Virtuoso 主界面 -> File -> Import -> ​Stream
      • Stream File: 浏览找到 .../osu_soc-master/cadence/lib/tsmc018/osu018_stdcells.gds2​ (这个文件通常在 lib 文件夹同级或里面)。
      • Library: 选择刚才新建的 OSU_stdcells
      • 点击 ​Translate
    3. 这会自动把版图数据转换成 Virtuoso 的库。完成后,你再进行“第四步”即可。

     ↩︎
  10. 转换库

    终端不能在同一个开启

    这是一个非常典型的 “操作位置冲突” 错误。

    简单来说:你正在 /root/Desktop/ ​ 目录下运行转换工具,而你要修改的 cds.lib​ 文件也在这个目录下。cdb2oa​ 工具为了保护文件不被写坏,禁止在包含 cds.lib 的同一级目录下运行它自己。

    ✅ 解决方案:换个地方运行命令

    你只需要退到其他目录(比如 /tmp 临时目录),然后“远程遥控”运行转换命令即可。

    请​关闭 Virtuoso,打开终端 (Terminal),严格按照以下 3 步操作:

    第一步:进入临时目录

    在终端输入:

    Bash

    1
    
    cd /tmp
    

    (这一步是为了离开 Desktop 目录,避开那个报错)

    第二步:运行转换命令

    复制并运行下面这行命令(这是根据你报错日志生成的修正命令):

    Bash

    1
    
    cdb2oa -lib OSU_CDB -cdslibpath /root/Desktop/cds.lib
    
    • 解释:

      • -lib OSU_CDB:转换你刚才定义的那个旧版库。
      • -cdslibpath ...:告诉工具去哪里找你的配置文件。
    • 执行过程中: 屏幕可能会滚动很多日志,如果没有报错 ERROR​,并且最后显示 cdb2oa 结束,那就是成功了。

    第三步:重启 Virtuoso 验证

    1. 回到你的工作目录:
    2. 打开 ​Library Manager
    3. 点击左侧的 OSU_CDB 库。
    4. 关键时刻: 看中间的 Cell 列表(比如点 AND2X1​),现在右边的 View 列表里应该同时出现了 ​layout​, ​schematic​, 和 ​symbol

    🚀 最后一步:重新导入网表 (Verilog In)

    一旦你在 Library Manager 里看到了 ​symbol,就说明你已经拿到了“拼图的说明书”。

    1. 打开 ​File -> Import -> Verilog

    2. Reference Libraries 必须修改为:

      1
      
      OSU_CDB basic analogLib
      

      (注意:一定要填刚才转换成功的库名 OSU_CDB,不要再填那个只有 Layout 的 OSU_stdcells了)

    3. 点击 ​OK

    这次导入生成的 Schematic,必定是连线完整的电路图! ↩︎

  11. 模型库

    这是一个非常关键的发现。从你的截图来看,tran_models​ 在你的 Windows 系统里显示为一个​黄色文件夹​,这在标准的 FreePDK45 结构中是不太正常的(通常它应该是一个名为 tran_models.sp​ 的​文件)。

    这很可能是解压或下载过程中产生的问题(例如多套了一层文件夹)。

    请按照以下 3 步操作来修复:

    第一步:点进这个文件夹看看

    请双击打开截图中的这个 tran_models​ ​文件夹

    • 情况 A​:如果你在里面看到了一个叫 tran_models.sp​ 或者 models.sp​ 的文件,​那个才是真正的模型文件
    • 情况 B:如果你点进去是空的,或者是乱码文件,那么可能是文件丢失了。

    通常正确的路径结构应该是:

    …/ncsu_basekit/models/hspice/tran_models.sp (这是一个文本文件)

    第二步:确认文件路径(Windows vs Linux)

    由于你在跑 Spectre 仿真(这是 Linux 软件),而你的截图是 Windows 界面,说明你用了虚拟机共享文件夹(Virtual_share)。

    绝对不要在 Cadence 里面直接填 Windows 的路径(如 D:\Virtual_share...),Cadence 读不懂。

    你需要找到这个文件在 ​Linux 系统里的对应路径。通常它长这样:

    • /mnt/hgfs/Virtual_share/des_test/ncsu_basekit/models/hspice/tran_models/tran_models.sp
    • 或者 /home/你的用户名/Desktop/share/...

    第三步:在 ADE 中加载正确的文件

    1. 回到 Cadence ADE 的 Model Libraries 设置窗口。
    2. 点击 Browse(浏览),沿着 Linux 的挂载路径 找到那个真正的 .sp 文件。
    3. 加载后,Section 一栏​留空(不要填 tt)。

    如果你在文件夹里找不到 .sp 文件:

    你可以直接退回到上一级目录 …/ncsu_basekit/models/hspice/,看看这一层有没有名为 hspice_nom.include 或者 tran_models.sp 的文件。如果有,直接用那个即可。

    一句话总结: 请点进那个黄色文件夹,找到里面的 .sp 文件,并在 Cadence 里通过 Linux 路径加载它。 ↩︎