前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【日更计划100】数字IC基础题【SV部分】

【日更计划100】数字IC基础题【SV部分】

作者头像
空白的贝塔
发布2021-04-23 15:27:54
1.2K0
发布2021-04-23 15:27:54
举报
文章被收录于专栏:摸鱼范式摸鱼范式

欢迎大家加入2022届数字IC交流群,QQ群号 1060380138

上期答案

[221] 什么是mailbox?如何使用mailbox?

mailbox是一种通信机制,用于线程之间的数据交换。数据在一个线程存入mailbox中,在另一个线程中检索。下面是mailbox的声明与创建的示例:

代码语言:javascript
复制
mailbox mbxRcv; 
mbxRcv = new(); 

将数据存入mailbox中可以使用put(阻塞)和peek(非阻塞)实现,从mailbox中取出数据可以使用get(阻塞)和try_get(非阻塞)方法,查询mailbox中的数据数量可以使用num()方法。

[222] 有限容量和无限容量的mailbox有什么区别?如何创建?

有限容量的mailbox是指邮箱在创建时就指定容量。

代码语言:javascript
复制
mailbox mbxRcv;
mbxRcv = new(10);  //size bounded to 10

无限容量的mailbox是指邮箱再创建时不指定容量。

代码语言:javascript
复制
mailbox mbxRcv;
mbxRcv = new();   //size is unbounded or infinite

有限容量的mailbox如果存满,线程将无法继续存入数据,只到mailbox有空间。

[223] 什么是systemverilog中的event?如何触发event?

event类型的变量不用于存储数据,用于线程同步。可以使用"->"显式触发事件,而线程可以通过"@"来等待事件的触发,阻断线程只到事件被触发。event为两个或者多个同时运行的进程的同步提供强大而有效的手段。

下面的示例中,两个线程通过event进行同步。一旦发送请求,send_req()将会触发一个事件,而receive_response()检测到事件被触发以后就会继续执行任务。

代码语言:javascript
复制
module test; 
    event req_send;
 
    initial begin
        fork
            send_req(); 
            receive_response);
        join 
    end

    task send_req();    //create and send a req
        -> req_send; //trigger event
    endtask

    task receive_response(); 
        @req_send; //wait until a send event is triggered 
        //collect response 
    endtask 
endmodule
[224] 如何合并两个event?

可以指将将一个event变量赋值给另一个event变量,此时两个event变量都指向同一个同步对象,可以认为两者合并。

[225] 什么是systemverilog中的std::randomize()方法?何时使用它?

std::randomize()是作用域随机化函数,无需定义类或者实例化类对象仅能对当前作用域中的数据进行随机化。如果某些需要随机化的变量不是类的成员,则需要使用std::randomize()。下面是一个示例。

代码语言:javascript
复制
module stim; 
    bit [15:0] addr; 
    bit [31:0] data;
    function bit gen_stim(); 
        bit success, rd_wr; 
        success = std::randomize(addr, data, rd_wr);  
        return rd_wr ;
    endfunction
    … 
endmodule

std::randomize()和类的randomize()具有相似的功能,也可以使用约束,下面是一个通过with添加约束的示例。

代码语言:javascript
复制
success = std::randomize( addr, data, rd_wr ) with {rd_wr -> addr > 'hFF00;};

本期题目

[226] 在派生类中可以覆盖基类中的约束嘛?如果可以,如何实现?
[227] 下面的systemverilog代码的调用有什么问题?
代码语言:javascript
复制
function int count_ones ( ref bit [9:0] vec ); 
    for( count_ones = 0; vec != 0; vec = vec >> 1 )
        begin
            count_ones += vec & 1'b1; 
        end
endfunction

constraint C1 { length == count_ones( myvec ) ; }
[228] 下面两个派生类有什么不同?
代码语言:javascript
复制
class Base; 
    virtual function printA(); 
    endfunction
endclass
1)     
class Derived extends Base; 
    function printA(); 
        //new print implementation 
    endfunction 
endclass 
2)
class Derived extends Base; 
    virtual function printA(); 
        //new print implementation
    endfunction
endclass
[229] 找出下面代码中的问题(如果有的话)
代码语言:javascript
复制
class Packet;
    bit [31:0] addr;
endclass

class ErrPacket extends Packet;
    bit err;
endclass
 
module Test;
    initial begin
        Packet p;
        ErrPacket  ep;
        ep = new(); 
        p = ep;
        $display("packet addr=%h err=%b", p.addr, p.err);
    end
endmodule
[230] 现有下面两个类,请问在示例代码中compute_crc函数的调用顺序是?
代码语言:javascript
复制
class Packet; //Base Class
    rand bit [31:0] src, dst, data[8]; // Variables
    bit [31:0] crc;
    virtual function void compute_crc;
        crc = src ^ dst ^ data.xor;
    endfunction
endclass : Packet
 
class BadPacket extends Packet;  //Derived class
    rand bit bad_crc;
    virtual function void compute_crc;  //overriding definition
        super.compute_crc();  // Compute good CRC
        if (bad_crc) crc = ~crc; // Corrupt the CRC bits
    endfunction
endclass : BadPacket

正确答案将在下一期公布,或者到下面的文章获取答案

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 摸鱼范式 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 上期答案
  • 本期题目
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档