SystemVerilog结构体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SystemVerilog结构体相关的知识,希望对你有一定的参考价值。

参考技术A

本文所有源码可通过后台回复 “结构体”获得

结构体由关键字 struct 声明,且结构体中的成员可以是任何数据类型

如下定义一个结构体:

结构体就如同一个集合,集合中包含各种变量和常量,并且这些变量和常量可以用结构体名进行引用,引用方式为 <结构体名>.<变量名>

如果要用到上面定义的结构体中的变量c,可以这样引用 Instruction_Word.c

结构体也可以整体显示声明为变量整体或者线网整体

结构体整体可以声明为线网类型,但结构体内部不能使用线网类型

像上面这个例子,我们把结构体名定义的比较长,每次引用结构体内的变量,会显得冗长,这里可以利用 typedef 将结构体声明为用户自定义类型

这里有两点需要说明

可以在实例化结构体时对内部的变量进行初始化,方法是用 \' ,大括号里的 数值个数及次序必须与成员个数及次数一致

看个例子

运行结果如下

注意:大括号前的符号是 英文的单撇号

刚开始以为是Esc键下面的那个按键,结果就运行失败了

尝试一下在实例化的时候删除一个赋值

看看编译会出现什么情况

看来赋值时的个数确实要与结构体内部变量的个数一致

如果我们一时间只想改变结构体中某个成员的值,可以单独给这个成员赋值

就像上面这个例子,在初始化后,我们只想改变变量 flag 的值,可以这样

从运行结果中可以看到,初始化时flag为0,通过单独给flag赋值后,变为1

结构体表达式赋值与初始化类似

有两种形式

我们试试两种方式赋值是否都可行

可见两种方式都可行!

那么这两种方式能不能混合使用呢?

我们在显示后面再加两句

运行结果显示 不能混合使用

结构体表达式的方式是不是类似于Verilog中module的调用,分为按位置调用和按名称调用,只不过不能有缺省

关键字 default 可以将结构体的所有成员指定为默认值,像这样 \'default:0

可以看到运行结果均为对应位宽的默认数值

优先级排序:default赋值 < 数据类型赋值 < 成员名称赋值

优先级高的赋值会覆盖掉优先级低的赋值

用一个例子测试一下

可以看到,最终输出的结果是 成员名赋值 的结果,因为按成员名称赋值的优先级最高

压缩结构体就像一个向量,所有的成员都是向量中的元素,成员按照在结构体中的顺序,依次是向量的高位和低位

比如下面这个压缩结构体:

按照压缩变量的说法, title, middle, endle 会组成一个向量,其顺序如下

为了验证这一点,同样做一个小测试

从结果中可以看到, title 是高四位, middle 是中间位, endle 是低两位,与上述吻合

有一点需要注意,这里是 packed 不是定义包的那个 package ,并且顺序不能搞错,一定是 struct packed ,而不是 packed struct

像上面例子中定义的结构体,可以改为 struct packed singed 便是有符号的压缩结构体

本文主要参考《SystemVerilog硬件设计及建模》

SystemVerilog 编写FSM


SystemVerilog 编写FSM


题目

技术图片

SystemVerilog实现

module ExampleFSM (
    input     logic clk     ,
    input     logic reset   ,
    input     logic X       ,
    output    logic Y       
);

    typedef enum logic [2:0] {A, B, C, D, E} state ; // 定义枚举类型

    state currentState, nextState ; // 声明自定义类型变量

    always_ff @(posedge clk , posedge reset)  // 状态转移,同步时序
        if (reset) 
            currentState <= A ;
        else
            currentState <= nextState ;

    always_comb  // 状态转移条件判断,组合逻辑
        case (currentState)
            A : if (X)  nextState = C ;
                else    nextState = B ;
            B : if (X)  nextState = D ;
                else    nextState = B ;
            C : if (X)  nextState = C ;
                else    nextState = E ;
            D : if (X)  nextState = C ;
                else    nextState = E ;
            E : if (X)  nextState = D ;
                else    nextState = B ;
            default :   nextState = A ;
        endcase

//    assign Y = (currentState == D | currentState == E) ;  // 组合输出

    always_ff @(posedge clk , posedge reset)
        if (reset) 
            Y <= 1‘b0 ;
        else begin
            Y <= (nextState == D | nextState == E) ;
        end


endmodule

仿真

`timescale 1ns/1ns 
module ExampleFSM_TB ();
    logic        clk=1       ;
    logic        reset     ;
    
    logic        in        ;
    logic        out       ;
    logic        expectOut ;
    logic [31:0] i         ;

    ExampleFSM dut (
        .clk    ( clk    ),
        .reset  ( reset  ),
        .X      ( in     ),
        .Y      ( out    )
    );

    logic [2:0]  testVector [1000:0] ;

    initial begin
        $readmemb ("TestBenchVector.txt", testVector, 0, 19) ;
        i = 0;
        reset = 1; in = 0;

        #200ns; $finish;
    end

    always @(posedge clk) begin
        {reset, in, expectOut} <= #2 testVector[i] ; 
        $display(reset, in, expectOut, $time);
    end

    always @(negedge clk) begin
        if (expectOut !== out) begin
            $display("wrong output for inputs %b, %b != %b, address %d", {reset, in}, expectOut, out, i, $time);
        end
        i = i + 1 ;
    end
    
    always begin
        clk <= 1; #5 ;
        clk <= 0; #5 ;
    end

//-----------------------------------------
//   for VCS generate fsdb file
//-----------------------------------------
initial begin
   $fsdbDumpfile("./digital.fsdb");
   $fsdbDumpvars(0,ExampleFSM_TB,"+all");
   $fsdbDumpflush();
end


endmodule

激励向量文件:TestBenchVector.txt

10_0
10_0
10_0
00_0
01_0
01_1
01_0
00_0
01_0   // 01_1
00_1
10_1
11_0
11_0
11_0
11_0
11_0
11_0
11_0
11_0
11_0

技术图片

以上是关于SystemVerilog结构体的主要内容,如果未能解决你的问题,请参考以下文章

SystemVerilog:从结构向量中,获取一个向量,该向量收集每个结构的一个字段

问题记录——SystemVerilog

msgsnd的一个小问题

从验证的角度,systemverilog和systemc谁更合适

SystemV-IPC

Linux-进程间通信