当前位置: 首页 > article >正文

Synopsys软件基本使用方法

Synopsys软件基本使用方法

  • 1 文件说明
  • 2 编译流程
  • 3 查看波形
  • 4 联合仿真

本文主要介绍Synopsys软件vcs、verdi的基本使用方法,相关文件可从 GitHub下载。

1 文件说明

  • 创建verilog源文件add.v、mult.v、top.v
    module add (
      input  signed [31:0]	dina,
      input  signed [31:0]	dinb,
      output signed [31:0]	dout
    );
    
    assign dout = dina + dinb;
    
    endmodule
    
    module mult (
      input  signed [31:0]	dina,
      input  signed [31:0]	dinb,
      output signed [31:0]	dout
    );
    
    assign dout = dina * dinb;
    
    endmodule
    
    module top (
      input                clk,
      input                rstn,
      input  signed [31:0] dina,
      input  signed [31:0] dinb,
      output signed [31:0] dout
    );
    
    wire signed [31:0] add_dout;
    wire signed [31:0] mult_dout;
    
    add add_i(
      .dina(dina),
      .dinb(dinb),
      .dout(add_dout)
    );
    
    mult mult_i(
      .dina(dina),
      .dinb(dinb),
      .dout(mult_dout)
    );
    
    reg signed [31:0] add_inv;
    reg signed [31:0] mult_inv;
    always @(posedge clk) begin
      if (!rstn) begin
        add_inv <= 0;
        mult_inv <= 0;
      end
      else begin
        add_inv <= -add_dout;
        mult_inv <= -mult_dout;
      end
    end
    
    assign dout = add_inv + mult_inv;
    
    endmodule
    
  • 创建仿真文件tb.v
    `timescale 1ns/1ns
    
    module tb;
    reg                clk;
    reg                rstn;
    reg  signed [31:0] dina;
    reg  signed [31:0] dinb;
    wire signed [31:0] dout;
    
    initial begin
      #0 begin clk = 1; rstn = 0; end
      #4 begin rstn = 1; end
    end
    always #2 clk = !clk;
    
    initial begin
      #0 begin dina <= 3; dinb <= 4; end
      #4 begin dina <= -5; dinb <= 16; end
      #8;
      $finish;
    end
    
    top top_i(
      .clk (clk),
      .rstn(rstn),
      .dina(dina),
      .dinb(dinb),
      .dout(dout)
    );
    
    initial begin
      // 指定文件名称和限制文件大小(单位MB)
      $fsdbDumpfile("./rtl.fsdb", 32);
      // 导出的信号
      // $fsdbDumpvars; //所有信号
      $fsdbDumpvars(0, top_i); //top_i下的所有信号,包括子模块的信号
      // $fsdbDumpvars(1, top_i); //top_i下的所有信号,不包括子模块的信号
      // $fsdbDumpvars(2, top_i); //top_i和下一层子模块add_i和mult_i下的所有信号
    end
    
    endmodule
    
  • 创建文件流表file.list
    tb.v
    top.v
    add.v
    mult.v
    
  • 创建编译脚本Makefile
    .PHONY:
      vcs sim verdi clean
    
    vcs:
      vcs -full64 -sverilog -debug_access+all -f file.list -timescale=1ns/1ns \
      -kdb -lca -cpp g++-4.8 -cc gcc-4.8 -LDFLAGS -Wl,--no-as-needed
    # -full64:64位的系统需要添加
    # -sverilog:识别systemverilog的语法
    # -debug_access+all:生成debug所需文件
    # -f file.list:将file.list中所有.v文件进行编译
    # -timescale=1ns/1ns:设置仿真精度
    # -kdb:生成KDB文件,仿真时生成verdi的库文件simv.daidir
    # -lca:支持动态数据类型
    # -cpp g++-4.8 -cc gcc-4.8 -LDFLAGS -Wl,--no-as-needed:指定编译选项
    sim:
      ./simv -verdi
    # -l run.log:记录终端打印信息
    # -verdi:打开verdi进行动态调试
    # +fsdb+functions:抓取function和task内部信号
    verdi:
      verdi -ssf rtl.fsdb
    # -ssf rtl.fsdb:打开波形文件
    clean:
      rm -rf csrc simv* *.lib *.lib++ nLint* verdi_config_file
      rm -rf *.log *.vpd *.fsdb* *.key *log rtl.fsdb*
    

2 编译流程

  • 执行make vcs对verilog源文件进行编译,编译成功会生成simv文件
  • 执行make sim进行仿真,仿真成功会生成rtl.fsdb文件
  • 执行make verdi打开波形文件

3 查看波形

打开后的verdi界面如下图所示
在这里插入图片描述
将Instance栏中的top_i拖动到下面的波形界面添加波形信号,通过工具栏上的工具可进行缩放、移动操作,右键选择操作信号,在Set Radix可更改信号的数据显示格式,通过Set Notation可改变是否为符号数,通过Highlight可改变波形颜色。波形界面可拉出verdi界面单独显示,以此显示更多信号。
在这里插入图片描述
直接通过添加信号无法显示模块中的中间变量,如add_inv和mult_inv,点击菜单栏的Signal→Get Signals,选中这两个信号,点击Apply可添加到窗口中。
在这里插入图片描述
在这里插入图片描述
点击菜单栏的File→Save Signal可保存波形配置为.rc文件,关闭波形窗口后可通过工具栏重新打开一个新的窗口,点击File→Restore Signal重新加载.rc文件打开保存的配置。

4 联合仿真

如果在执行sim的参数中添加了-verdi,可进行vcs和verdi的联合调试,在完成仿真后会打开verdi窗口,可进行上述操作打开窗口并添加信号,点击工具栏的绿色箭头可开始动态仿真,再次点击绿色箭头会重置。此外,工具栏多了很多工具,可进行逐步调试。
在这里插入图片描述


http://www.kler.cn/a/461232.html

相关文章:

  • 【C语言】_指针运算
  • DDoS攻击防御方案大全
  • 46. Three.js案例-创建颜色不断变化的立方体模型
  • word文档中的文档网格——解决相同行间距当显示出不同行间距的情况
  • MySQL秘籍之索引与查询优化实战指南
  • parquet文件数据格式介绍以及python pandas对parquet常见操作
  • deepin系统Docker使用指南:常用命令精讲
  • 建筑机器人崛起 | KMDA-7611助力智能喷涂一体机器人
  • 【数据结构】单向循环链表的使用
  • 01-2023年上半年软件设计师考试java真题解析
  • 小程序 手写tab超出滑动。view超出可以横滑动
  • Kafka高性能设计
  • 手写顺序流程图组件
  • Windows onnxruntime编译openvino
  • 部分开源数据整理
  • win32汇编环境下,对话框程序中生成listview列表控件,点击标题栏自动排序的示例
  • STM32 高级 物联网通讯之LoRa通讯
  • SNIPE-IT详细安装教程(已安装成功)
  • RabbitMQ - 2 ( 21000 字 RabbitMQ 入门级教程 )
  • Android学习小记3
  • 耳切法简述
  • 矩阵的因子分解3-LU分解和LDU分解
  • WebSocket 入门详解
  • 【每日学点鸿蒙知识】Taro、native层获取文件宽度、位置变化callback、数据迁移、oh_modules说明等
  • QT--多线程
  • 深入浅出 Spring (二)| 依赖注入(DI)、自动装配