zoukankan      html  css  js  c++  java
  • SystemVerilog for design 笔记(二)

    转载请标明出处

    1. System Verilog文本值和数据类型

    1.1. 增强的文本值赋值

    相对于verilogSV在文本值赋值时可以1.无需指定进制    2.赋值可以是逻辑1

    用法:

    reg [63:0] data;

    data = '0 //fills all bits on the left-hand side with 0 按位赋值

    data = '1; // fills all bits on the left-hand side with 1

    data = 'xz; // fills all bits on the left-hand side with x z

    1.2. `define增强

    SV中宏文本可以包含特殊字符。

    • 进行宏文本字符串内的变量替换(通过在字符串的引号前加上重音号’来实现

      `define print(v)

      $display(‘"variable v = %h’", v)

      `print(data);

    • 通过宏建立标识符名(通过两个连续的重音符’’作为不引入空格的间隔符)没懂

    1.3. System Verilog变量

    SV中的信号同时具有对象类型(reg,integer,wire)和数据类型(logic,bit.etc)。

    • 四态变量:logic(类似verilog中的reg0,1,x,z(缺省值x

    Logic是一种数据类型,而不是变量类型:wire logic [63:0] data; // a 64-bit wide net

    • 两态变量:包括bit(1),byte(8),shortint(16),int(32),longint(64)括号内是位数(缺省值0)

    在可综合RTL硬件模型中,常使用四态:

    其中z用于表示未连接或三态逻辑;x有助于检测和隔离设计错误

    而系统级和交易级常用两态

    互相赋值:logic赋值给bit时,x/z0

    Integertime: 具有预定义宽度的 四态数据类型的  变量 ;

    int,byte,shortint,longint:具有预定义宽度的 两态数据类型的  变量 。

    var : variable)表示对象是一个变量      var logic [7:0] a; // 4-state 8-bit variable

    可用不含数据类型的var声明变量,此时默认变量为logic类型

    var [7:0] d; // 4-state 8-bit variable

    所有的Verilog线网类型 (wire, uwire, wand, wor, tri, triand,trior, tri0, tri1, trireg, supply0 and supply1) 都隐含为四态逻辑数据类型。 There are no 2-state net types.

    wire [31:0] busB; // 声明一个线网类型,隐含为四态逻辑数据类型

    1.4. 数据类型规则的放宽

    赋值任意变量方式(不可对一个变量同时使用过程赋值&持续赋值):

    •  initial / always过程块中赋值(过程赋值)
    •  always_comb / always_ff / always_latch过程块中赋值(过程赋值)
    •  持续赋值assign xx=zzzzz;
    • 单个模块或原语的output/input端口驱动赋值

    单驱动逻辑使用变量,多驱动逻辑使用线网(net

    1.5. 有符号和无符号修饰符

    Verilog: 缺省:无符号数         有符号定义关键词:signed   

    SV: 缺省有符号数:byte, shortint, int, and longint.  无符号定义关键词:unsigned

    其中,signedunsigned在类型关键字后使用:int unsigned u; // SV定义

    1.6. 静态和自动变量

    Verilog中自动taskfunction中的变量都是动态的。

    SV中通过staticautomatic声明变量是静态还是动态。

    appear within tasks, functions, begin...end blocks, or fork...join block

    (不能在module中显示声明,module中都是静态变量)

    SV中存储方式默认静态。(例外:动态task/function中的变量默认动态)

    1.6.1. 初始化:

    l Verilog中只能在模块级声明的变量进行内嵌初始化(声明的同时初始化)

    l SVtask/function中声明的变量可以内嵌初始化(发生在仿真开始前)

     

     

    • 静态变量只初始化一次,第二次调用静态函数时,其中的静态变量的初始化操作直接被跳过

    function int count_ones (input [31:0] data);

    logic [31:0] count = 0; // initialized once.第二次调用count_ones时,count的值为上 次调用时的赋值

    logic [31:0] temp = data; // initialized once.首次调用count_ones时,data的值为0. 第二次直接跳过

    endfunction      

    • 自动变量在每次taskfunction调用时都会动态的创建,调用完毕后动态的释放存储区。

    静态变量初始化不可综合;动态变量初始化可综合(不能传送到task/function/block外)。

    v 用const声明的变量的内嵌初始值可综合

    1.6.2. 使用原则:

    alwaysinitial块中:无内嵌初始化使用静态变量;有内嵌初始化使用动态变量

    task/function是可重入的,则应设为自动的(除非需记录task/func被调用的次数)

    非可重入的,用来描述硬件独立部分的task/function:静态

    变量

    1.7. 变量初始化的确定性

    l Verilog中内嵌初始化顺序不确定

    l SV中内嵌初始化先于仿真时刻0执行的事件,不引发仿真事件

    Eg.

    logic resetN = 0; // declare & initialize reset

    always @(posedge clock, negedge resetN)

    if (!resetN) count <= 0; // active low reset

    else count <= count + 1;

    如果是Verilog,有可能resetN未初始化时先执行always,这样在仿真0时刻,resetN初始化的时候会触发always块。

    如果是SVresetN在仿真开始前已完成内嵌初始化,因此仿真开始时,always只有在resetN的值发生跳变的时候才被触发。

    v testbench应将变量初始化为无效状态

    1.8. 强制类型转换

    l 静态转换(编译时转换,不会检查结果的有效性)(可综合)

    ² 数据类型强制转换:<type>’(<expression>)

    Eg. 7+ int’(2.0 * 3.0);//6.0强制转换成int然后加7

    ² 向量宽度强制转换:<size>’(<expression>)

    Eg. logic [15:0] a, b, y;  y = a + b**16'(2); //将文本值2强转为16位宽

    ² 符号强制转换:<sign>’(<expression>)

    Eg. shortint a, b;int y; y = y - signed'({a,b}); //将拼接结果强转为有符号数

    l 动态转换(运行时进行待转换数值的检查)(不可综合)

    $cast系统函数:$cast( dest_var, source_exp );强制转换source_exp的结果为dest_var的类型

    $cast转换失败时,源变量不变。$cast可返回状态标志,标识是否转换成功。

    $cast的主要用途:将表达式的结果赋给enum类型变量。

    1.9. 常数

    l Verilog常数类型:

    parameter,specparam,localparam,只能在module,static task/function中声明

    l SV可通过const在任何地方将任何变量声明为常数

    一个const常数实际上是一个只能被初始化的常量。

  • 相关阅读:
    CSS中 link 和@import 的区别是?
    display:none 和 visibility: hidden的区别
    怎样清除浮动
    纯CSS水波纹按钮效果
    如何让一个div水平垂直居中
    如何让一个div水平居中
    Vue封装简单的axios库
    Echarts-x轴数据换行显示
    Vue+Webpack打包路径问题
    Vue中Mint-ui底部弹出(上拉)组件
  • 原文地址:https://www.cnblogs.com/daisyuer/p/9205647.html
Copyright © 2011-2022 走看看