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

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

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

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

上期答案

[211] 如何对一个生成一个随机动态数组,并且元素两两各不相同?参考下面的代码
代码语言:javascript
复制
class TestClass;
    rand bit[3:0] my_array[];//dynamic array of bit[3:0]
endclass
  1. 使用unique进行约束
代码语言:javascript
复制
constraint c_rand_array_uniq {
    my_array.size == 6;  //or any size constraint
    unique {my_array};   //unique array values
}
  1. 不适用unique进行约束,使用post_randomize回调函数完成
代码语言:javascript
复制
constraint c_rand_array_inc {
    my_array.size == 6 ;// or any size constraint
    foreach (my_array[i])
        if(i >0)
            my_array[i] > my_array[i-1];
}
function post_randomize();
    my_array.shuffle();
endfunction
[212] “fork - join”, “fork - join_any” 和“fork - join_none”之间有什么区别?

systemverilog支持三种类型的动态进程,可以在运行时创建,并作为独立线程执行。

  1. fork-join:使用“ fork .. join”创建的进程作为单独的线程运行,但是父进程停滞不前,直到所有进程全部执行完。如果我们看下面的示例:共有三个进程task1,task2和task3,它们将并行运行,并且只有在这三个进程全部完成之后,join语句之后的$display()才会执行。
代码语言:javascript
复制
initial begin
    fork
        task1; // Process 1
        task2; // Process 2 
        task3; // Process 3   
    join  $display(“All tasks finished”);
end
  1. fork-join_any:使用“ fork…join_any”创建的进程作为单独的进程运行,但是父进程会在任何一个子进程完成后继续。其余进程和父进程可以并行运行。如果我们看下面的示例:有三个进程-task1,task2和task3将并行运行。当task1 / task2 / task3之一完成时,join_any将完成,并在其他线程可能仍在运行时执行$ display()。
代码语言:javascript
复制
initial begin
    fork
        task1; // Process 1 
        task2; // Process 2  
        task3; // Process 3 
    join_any 
    $display(“Any one of task1/2/3 finished”);
end
  1. fork-join_none:使用“ fork…join_none”创建的进程将作为单独的进程运行,但是父进程不会停滞并且也将并行进行。参考以下示例,其中有三个进程-task1,task2和task3,它们将与父进程并行运行。
代码语言:javascript
复制
initial begin
    fork
        task1; // Process 1 
        task2; // Process 2  
        task3; // Process 3 
    join_none 
    $display(“All tasks launched and running”);
end
[213] “wait fork”和“disable fork”的作用是什么?

在使用“ fork..join_none”或“ fork..join_any”时,有时候需要父进程和子进程进行同步,这可以通过wait fork完成。

代码语言:javascript
复制
initial begin
    fork    task1; // Process 1 
        task2; // Process 2
    join_none 
    $display(“All tasks launched and running”); 
    wait fork; 
    $display(“All sub-tasks finished now”);
end

类似的,disable fork可以提前将子进程停止。

代码语言:javascript
复制
initial begin
    fork   
        task1; // Process 1 
        task2; // Process 2  
    join_any 
    $display(“One of task1/2 completed ”);
    disable  fork;
    $display(“All other tasks disable now”); 
end
[214] 硬约束和软约束有什么区别?

systemverilog中编写的常规约束为硬约束,对成员的随机化必须始终满足约束,如果约束无解,则会导致错误。如果将约束定义为软约束,在没有外部约束的条件下,和硬约束一样,外部约束的优先级比软约束高。软约束通常用于指定随机变量的默认值和分布,并且可以被外部特定的约束覆盖。

代码语言:javascript
复制
class Packet;
    rand int length;
    constraint length_default_c {
        soft length inside {32,1024};
    }
endclass
 
Packet p = new();
p.randomize() with { length == 1512; }

上例中,如果约束没有定义为软约束,则随机化会失败。

[215] 下面每个线程的输出是什么?
代码语言:javascript
复制
initial begin
 for (int j=0; j<3; j++) begin
     fork
         automatic int result;
         begin
             result= j*j;
             $display("Thread=%0d value=%0d", j, value);
         end
     join_none
     wait
     fork;
 end
end

由于“ j”不是每个线程的动态变量,因此在生成每个线程后它会不断递增,并且当所有线程开始执行时,每个线程将看到的j都是3。因此,每个线程都将输出9。如果每个线程打算使用不同的值,则应将“ j”的值复制到一个自动变量,如下所示:

代码语言:javascript
复制
automatic int  k = j;
begin
    result = k*k;
end

你答对了吗

本期题目

[216] 下面的代码会产生多少个并行的线程?
代码语言:javascript
复制
fork
    for (int i=0; i < 10; i++ ) begin 
        ABC();
    end
join
[217] 下面的约束有什么错误?
代码语言:javascript
复制
class packet;
    rand bit [15:0] a, b, c;
    constraint pkt_c { 0 < a < b < c; }
endclass
[218] systemverilog中的虚方法和纯虚方法的区别是?
[219] 什么是Semaphores?何时使用?
[220] 下面两个约束有什么不同?
代码语言:javascript
复制
1) 
class ABSolveBefore; 
    rand bit A;
    rand bit [1:0] B;
    constraint c_ab {    (A==0) -> B==0;    solve A before B;  } 
endclass 
2)      
class ABSolveBefore; 
    rand bit A; 
    rand bit [1:0] B; 
    constraint c_ab {    (A==0) -> B==0;    solve B before A;  }
endclass

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

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

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

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

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

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