SV复习小结(三)local & soft

本文探讨了Verilog语言中local与soft关键字的应用。local用于指明变量作用域,避免随机化过程中出现变量覆盖的问题;soft则常与randomize with结合使用,为随机变量提供软约束条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、local

在声明类成员变量时:

(1)local就是本地变量,代码local int DONE,比如在父类中定义DONE,那么在子类中就不能调用DONE
(2)protected就是保护变量,在父类中定义protected nt DONE,这样定义,子类中就可以调用DONE,但是外部代码仍然不能操作该变量

除了在声明成员变量时,在使用内嵌约束进行随机化时也会需要使用local关键字:

class trans_rand;
    int [31:0] data;
    trans t,h;

    virtual task write_reg(bit[7:0] addr, bit[31:0] data);
        t = new();
    void'(t.randomize() with {data == local::data;});
        //local::data索引到的是形参data,
        //而不带前缀的data按就近原则索引到t中的data
    endtask

    virtual task send_trans();
    h = new();
    assert(h.randomize with {local::data >= 0 -> data == local::data;})
        //local::data索引到的是trans_rand类中的data,
        //而不带前缀的data按就近原则索引到h中的data
    endtask
endclass

个人认为local::这个域的声明就是说明这个变量不是被随机化中对象中的成员变量,然后一级一级往上找同名的变量,最先找到谁就是谁。对象t是有data传进来,所以先找到。

二、soft

 class chnl_trans;
    rand bit[31:0] data[];
    rand int ch_id;
    rand int pkt_id;
    rand int data_nidles;//模拟数据间的空隙
    rand int pkt_nidles;//模拟包之间的空隙
    bit rsp;
    constraint cstr{
      soft data.size inside {[4:32]};
      foreach(data[i]) data[i] == 'hC000_0000 + (this.ch_id<<24) + (this.pkt_id<<8) + i;
      soft ch_id == 0;
      soft pkt_id == 0;
      soft data_nidles inside {[0:2]};
      soft pkt_nidles inside {[1:10]};
    };
endclass

一般与randomize  with搭配使用,soft设定起始值,在外部用硬约束。检测是否被硬约束只要看是不是初始值了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值