zoukankan      html  css  js  c++  java
  • SV processses

    SV中的structured procedure

        1)intial procedure,keyword只有initial;最开始被调用一次;

        2)always procedure,keyword包括always,always_comb,always_latch,always_ff;

            整个仿真时间一直被调用;

        3)final procedure,keyword 只有final;最后被调用一次;

        4)Task;

        5)function;

    其他的procedure contexts,包括:coverage point expression,assertion sequence items,action blocks;

    always_comb,在time 0一定会被执行,这是与always (*)比较大的一个区别;

    always_latch,always_ff,需要用户做额外的检查,保证procedure中的是相应的logic;

    final procedure,最好只定义一个,多个之间的顺序是随机的,而且必须是不消耗仿真时间的,只是做一些display信息最好;

    SV中的block 声明:1)sequenetial block,begin,,,,end block;

             2)parallel block,fork,,,join/any/none  block;

    block中的name声明,可以加在begin或fork之后,并且相应的在end或者join/join_none/join_any之后也添加,组成一组。

          name声明可以对内部的local var创建新的一层hier,也方便disable调用;

    block中的label声明,加在begin或fork之前,end之后,组成一组;

          label并不创建新的hier,只是方便指定disable等。

    block的start和finish time可以指定为某个延时,或event;

          fork

            @a  begin,,,,end;

            @b  begin,,,,end;

          join

    procedure中的timing control

          1)delay control,加#表示,specify block中制定的delay,可以被sdf override掉;

                         组合逻辑,#在表达式之前,建模;

                       时序逻辑,#在等号右侧,建模;

                          tb中的输入激励,可以直接加#;

              2)event control,加@来进行表示;

                  implicit event,等待某个signal的value change;clock signal的pose/nege最为常用;

                     explicit event,显式声明某个event,然后做wait和trigger;

              posedge,从0-x/z也算;negedge,从x/z-0也算;

              @之后也可以添加class中的内容或,handle。主要相应的handle或者var变化,就是一个event的触发;

                

              不同的event之间,也可以进行or运算,或者用","来表示;

                always @(a,b,c)   = always @(a or b or c);  

              implicit类型的event_expression list 用 always @(*)   always  @*来表示;

                 conditional event表示,加入iff关键字;

                always @( a iff enable == 1)  在enable为1的情况下的a的edge跳变;

              sequence event表示某个sequence运行到end的时候,的结果时候改变

                sequence abc;

                  @ (posedge clk) a ##1 b ##1 c;

                endsequence;

                intial begin

                  @ abc  $display(“”);

                end

               level_sensitive event,使用wait关键字,

                wait expression;

                wait fork;等待所有的child-process都执行结束;

                wait_order  (identifier1,  identifier2,  identifier3) action_block(else等);  等event按顺序进行trigger; 

                    必须是显式声明的event 类型;

               level_sensitive sequence event,使用内部function  triggered;

                  

          3)intra_assignment timing control将delay不能写在assign中。可以是delay,也可以是event;

                  

    thread的创建:1)每个initial procedure;

            2)每个final procedure;

            3)每个always,always_comb,always_latch,always_ff procedure;

              4)每个fork---join的statement;

            5)dynamic process;

    process ctrl:wait,wait_order,wait fork;    

      wait fork,会等待当前进程的所有子进程结束,包括之前block块,未结束的进程。

          disable  task/block identifier,disable fork;

              wait fork和disable fork,等待或者disable该进程下的所以子进程;

              disable后不能加function的identifier; 

      disable block_name的格式,类似与verilog格式的static形式的disable,显示kill指定的process。

          process的指定,只通过hier来确定。(automatic task或者function中的object,不能通过hier来引用,只能通过block内部的hier name来确定)

                           (使用disable block_name的时候,需要注意block_name在多线程中情况)

      disable fork,更加切合sv dynamic的形式,查找当前begin end或者task, function中的进程,进行disable。

      program test;

        task automatic t(input int b);

          fork:ONE

            begin

              #b $display('%0b', b);

            end

            begin

              #b $display('%0b', b);

            end

          join_any

          //str1   disable ONE;     //使用这种disable,sim output 5  (因为hier是一样的,所以两个ONE的进程都被杀了)

          //str2   disable fork;    //使用这种disable,sim output 5 ; 10 

        endtask

      endprogram

      initial begin

        fork

          t(10);

          t(5);

        join

      end

    SV中定义了process的class,来对每个process做具体的控制;

          

          应用,await,kil,resume等function;

          

  • 相关阅读:
    C++基类的析构函数定义为虚函数的原因
    android的学习网站
    QT显示url图片
    Ubuntu安装JDK
    linux下打包压缩和解压命令
    嵌入式目录
    QT pri 文件的作用
    QT pro文件详细写法+实例
    Computer(树的直径做法)
    树的直径
  • 原文地址:https://www.cnblogs.com/-9-8/p/7742052.html
Copyright © 2011-2022 走看看