• VCS 工具学习笔记(1)



    目录

    引言

    平台说明

    关于VCS

    能力

    Verilog 仿真事件队列

    准备

    VCS工作介绍

    工作步骤

    支持

    工作机理

     编译命令格式

     编译选项

    示例 

     仿真命令格式

    仿真选项 

     示例

     库调用 -y

     总结

    实践

    设计文件

    仿真文件

    编译

    仿真

     关于增量编译

    日志文件记录

    编译仿真接续进行

    -o 选项

     +define 选项





    引言

    VCS 是Synopsys公司的EDA软件,主要用于Verilog 的逻辑仿真。这里记录一下学习的过程。软件的安装可以参考下面的链接:

    Synopsys EDA Tools 安装问题记录https://blog.csdn.net/qq_43045275/article/details/127630241软件的学习参考了如下的链接:

    数字IC设计之仿真工具synopsys VCS

    本系列的文章对此做一个整理,结合虚拟机内的的VCS工具进行实践。

    平台说明

    OS:Ubuntu 16.04

    EDA Tool :Vcs2016


    关于VCS

    能力

     支持语言:Verilog HDL、VHDL、System Verilog、PLI(可编程语言接口)

    PLI可以支持对C、C++、语言的编译仿真。

    Verilog 仿真事件队列

    1、Vcs读取所有的initial块、always块、连续赋值语句 assign等;

    2、首先执行无延迟语句,如寄存器初始化;

    3、将仿真时间设为 0 ;

    4、进入 active 区域,首先执行原语,即UDP(用户自定义原语,如基本的逻辑门、CMOS、PMOS逻辑、上下拉);然后执行显示 display(是一个系统任务);然后执行assign连续赋值语句(无延迟);而后是阻塞赋值语句,即always块内部的组合逻辑 “=”;

    最后是非阻塞赋值(always块的时序逻辑“<=”)右边表达式的计算

    5、进入 inactive 区域,此处主要处理 #0 延迟。

    6、进入非阻塞赋值(Nonblocking assign)区域。

    7、进入 monitor 区域,可以监测到非阻塞赋值的新值。

    8、进入 future 区域,处理其他逻辑。

    准备

    1、在工程路径下面创建该文件:

    2、代码:

    1. `timescale 1ns/1ps
    2. `define CASE1
    3. module TEST;
    4. reg clk,a,z,zin;
    5. always @ (posedge clk)
    6. begin
    7. a = 1'b1;
    8. #0 a = 1'b0;
    9. end
    10. `ifdef CASE1
    11. always @ (a) #0 z=zin;
    12. always @ (a) zin=a;
    13. `else
    14. always @ (a) z = zin;
    15. always @ (a) #0 zin = a;
    16. `endif
    17. initial
    18. begin
    19. #50 clk = 1'bz;
    20. #50 clk = 1'b0;
    21. #50 clk = 1'b1;
    22. #50 $finish;
    23. end
    24. endmodule

    操作

    1、在创建 .v 仿真文件所在的文件夹,右键打开终端。

    2、输入命令:

    vcs +v2k TEST.v

    其中  TEST.v  为文件名。

     完成界面:

    3、按照视频中的步骤,此时应用下面命令直接打开 DVE:

    ./simv -gui

    但是,我这边始终报错:

     按照错误的指示,我重新编译仿真文件,并且加入要求的选项:

     完成后,用上面的命令再次尝试,可以直接打开DVE

    4、添加波形界面:

     5、开始仿真

     6、仿真结果

     但是我此处的结果和视频中的不一致。猜测是VCS版本不同

    7、退出

    准备

    数字IC设计必备技能:

    1、基础的数字IC设计知识,数电等;

    2、熟悉linnux 或 Unix操作系统;

    3、熟练使用文本编辑器 VI 或VIM;

    VCS工作介绍

    工作步骤

    主要分为2步:

    1、编译(将源代码转换为二进制可执行文件 simv)

    2、仿真

    支持

     PLI,程序语言接口,可以支持在HDL语言中调用 C、C++程序

    多抽象级:行为级、RTL级、门级

    工作机理

     编译命令格式

     编译选项

    示例 

     仿真命令格式

    仿真选项 

     示例

     库调用 -y

     总结

    实践

    由于视频作者并没有公布源码,所以这里演示实践的时候,我自己随便写一个设计文件(简单状态机)和一个仿真文件。源代码给出:

    用状态机写一个计数器:

    当抓取到开始信号的上升沿后,开始计数并且输出有效信号拉高。计数到计数器全1时,结束计数,返回IDLE状态。

    设计文件

    1. // |--------------------------------- VCS test design file ---------------------------------
    2. // |Description : a simple fsm.
    3. // |Author : Xu Y. B.
    4. // |Date : 2022-11-06
    5. // |
    6. // |----------------------------------------------------------------------------------------
    7. `timescale 1ns/1ns
    8. module FSM #(
    9. // --------------module parameters specify ----------------
    10. parameter P_DATA_WIDTH = 10
    11. )(
    12. // --------------input / output ports specify--------------
    13. // input ports
    14. input I_CLK_100M,
    15. input I_RSTN,
    16. input I_FSM_START,
    17. // output ports
    18. output reg O_DATA_VAL,
    19. output reg [P_DATA_WIDTH-1:0] O_DATA
    20. );
    21. // --------------module internal parameters----------------
    22. localparam LP_ST_IDLE = 2'b01;
    23. localparam LP_ST_COUNT = 2'b10;
    24. // --------------module internal signals-------------------
    25. reg [1:0] R_STATE;
    26. reg [1:0] R_I_FSM_START;
    27. wire W_I_FSM_START_PDG;
    28. // --------------module logic------------------------------
    29. // grab the posedge of input signal I_FSM_START
    30. always @ (posedge I_CLK_100M)
    31. begin
    32. if(~I_RSTN)
    33. begin
    34. R_I_FSM_START <= 2'b00;
    35. end
    36. else
    37. begin
    38. R_I_FSM_START[0] <= I_FSM_START;
    39. R_I_FSM_START[1] <= R_I_FSM_START[0];
    40. end
    41. end
    42. assign W_I_FSM_START_PDG = R_I_FSM_START[0] & (~R_I_FSM_START[1]);
    43. always @ (posedge I_CLK_100M)
    44. begin
    45. if(~I_RSTN)
    46. begin
    47. R_STATE <= LP_ST_IDLE;
    48. O_DATA_VAL <= 1'b0;
    49. O_DATA <= {P_DATA_WIDTH{1'b0}};
    50. end
    51. else
    52. begin
    53. case(R_STATE)
    54. LP_ST_IDLE:
    55. begin
    56. O_DATA_VAL <= 1'b0;
    57. O_DATA <= {P_DATA_WIDTH{1'b0}};
    58. if(W_I_FSM_START_PDG)
    59. begin
    60. R_STATE <= LP_ST_COUNT;
    61. end
    62. else
    63. begin
    64. R_STATE <= R_STATE;
    65. end
    66. end
    67. LP_ST_COUNT:
    68. begin
    69. if(&O_DATA)
    70. begin
    71. O_DATA_VAL <= 1'b0;
    72. O_DATA <= {P_DATA_WIDTH{1'b0}};
    73. R_STATE <= LP_ST_IDLE;
    74. end
    75. else
    76. begin
    77. O_DATA_VAL <= 1'b1;
    78. O_DATA <= O_DATA + 1;
    79. R_STATE <= LP_ST_COUNT;
    80. end
    81. end
    82. default:
    83. begin
    84. R_STATE <= LP_ST_IDLE;
    85. end
    86. endcase
    87. end
    88. end
    89. endmodule

    仿真文件

    1. // |--------------------------------- VCS test testbench file -------------------------------
    2. // |Description : a simple fsm testbench.
    3. // |Author : Xu Y. B.
    4. // |Date : 2022-11-06
    5. // |
    6. // |----------------------------------------------------------------------------------------
    7. `timescale 1ns/1ns
    8. module TB();
    9. // --------------module parameters specify ----------------
    10. parameter P_DATA_WIDTH = 10;
    11. // --------------input / output ports specify--------------
    12. // input ports
    13. reg I_CLK_100M;
    14. reg I_RSTN;
    15. reg I_FSM_START;
    16. // output ports
    17. wire O_DATA_VAL;
    18. wire [P_DATA_WIDTH-1:0] O_DATA;
    19. // --------------clock setting-----------------------------
    20. `define CLK_PRD 10
    21. initial I_CLK_100M = 1'b0;
    22. always #(`CLK_PRD/2) I_CLK_100M = ~I_CLK_100M;
    23. // --------------control signals setting-------------------
    24. initial
    25. begin
    26. I_RSTN = 1'b0;
    27. I_FSM_START = 1'b0;
    28. #(`CLK_PRD*10);
    29. I_RSTN = 1'b1;
    30. #(`CLK_PRD*5);
    31. I_FSM_START = 1'b1;
    32. @(negedge O_DATA_VAL);
    33. #(`CLK_PRD*10);
    34. $finish;
    35. end
    36. // --------------initiate module---------------------------
    37. FSM #(
    38. .P_DATA_WIDTH(P_DATA_WIDTH)
    39. ) FSM_INST (
    40. .I_CLK_100M (I_CLK_100M),
    41. .I_RSTN (I_RSTN),
    42. .I_FSM_START (I_FSM_START),
    43. .O_DATA_VAL (O_DATA_VAL),
    44. .O_DATA (O_DATA)
    45. );
    46. endmodule

    之前用惯了sublime text3写代码,于是就将sublime text3 搬到Linux系统下,具体方法:

    1、较为简单:

    ubuntu16.04安装sublime text3

    2、较为详细:

    Sublime text在Linux下的安装

    安装完成后,直接在终端输入 subl 即可打开。

    关闭更新提醒:关闭sublime更新提示

    打开后图形操作界面以及方法和Windows下相同。

    Ubuntu16.4 使用中文输入法:

    ubuntu 16.04+中文输入法

    编译

    记得,虚拟机开机后,重新运行 lmg-scl,后面考虑将其放在启动文件内。

    仿真

    编译结束后执行仿真:

     添加信号进行波形仿真:

     

     

    状态信号可以显示其状态名:

     关于增量编译

    这里做一个对比,连续两次对源代码文件(未作修改)作增量编译,第二次就会有如下提示:

     

    日志文件记录

     

     

    编译仿真接续进行

     

    -o 选项

     +define 选项

    宏的定义:

    由于我展示的实际文件没有宏定义,所以这里仅做方法介绍。

    创建一个头文件,里面定义一个 NOTHING 的宏:

     

    1、在源代码里定义;

    2、通过 +define 选项指定;

     

    3、通过头文件的形式;

            -1- 在源文件中包含头文件

            -2-编译时增加包含的路径

     



    欢迎交流~~~~~~~

  • 相关阅读:
    01背包问题
    c# 二维图形绘制实践
    Python实现---南邮离散数学实验三:盖住关系的求取及格的判定
    Linux-管理文件系统及存储
    公众号如何让更多人看到?这三种方法超有效!
    Yolov5项目中关闭wandb
    第二章 人工智能专题之Python进阶 - Matplotlib库
    面试题:当你的JVM 堆内存溢出后,其他线程是否可继续工作?
    Mutisim仿真软件使用
    java-php-python-仓库管理系统计算机毕业设计
  • 原文地址:https://blog.csdn.net/qq_43045275/article/details/127691010