System Verilog 100问 —— 基础篇

1、什么叫做线程间的通信,线程以及线程间的通信方式有哪些?
测试平台中所有线程都需要同步并交换数据,所有数据交换和控制的同步被称为线程间的通信。在SV中通信方式有:信箱、事件、旗语。

2、system Verilog中有哪些覆盖率(coverage)的类型?
代码覆盖率(code coverage):量化执行了多少行代码(line coverage),执行了那些路径(path coverage),位变量的值是否覆盖了“0”和“1”(toggle coverage),状态机中的那些状态和转换已被访问(FSM coverage)。

功能覆盖率(functional coverage):和代码覆盖率不同,功能覆盖率衡量的设计的目的是否完整实现,是主观的。

断言覆盖率(assertion coverage):衡量在测试过程中断言的触发。

3、解释数据类型logic、reg和wire之间的区别
reg:并不意味这实际的寄存器,代表Verilog/SV中的数据存储元素,保存值直到将下一个赋值(不是通过assign语句赋值)。可以被综合成触发器,锁存器或者组合电路。

logic:不能被多驱动,改进了reg数据类型,可以被连续赋值。

wire:用于连接不同的元件,不同储值,被连续赋值(assign)胡总和端口(port驱动)。

4、clocking block的用处
interface指定testbench和DUT通信的信号,但是interface没有明确指定任何时序规则同步要求

SV添加了clocking block指定任何时序和同步要求,以确保testbench在正确的时间与DUT交互,还可以避免竞争冒险问题。

5、什么是竞争-冒险?
竞争:在组合电路中,信号经由不同的途径达到某一会合点的时间有先有后,这种现zhi象称为竞争。

冒险:由于竞争而引起电路输出发生瞬间错误现象称为冒险。表现为输出端出现了原设计中没有的窄脉冲,常称其为毛刺。

竞争与冒险的关系
有竞争不一定会产生冒险,但有冒险就一定有竞争。

解决方法:一是添加布尔式的消去项,二是在芯片外部加电容。

6、使用SV避免testbench与DUT之间竞争冒险的方法有哪些?
module中initial语句块调度在active region,而program中initial语句块调度在reactive region。

在program中使用非阻塞赋值来驱动设计信号,在re-NBA区域中对其进行更新。

通过带有# 0 input skews的clocking blocks。

7、什么是callback(回调)
callback是一种不改变实际代码的条件下更改为验证组件(Driver、Generator、Monitor)行为的机制。

8、抽象类(abstract class)的用途是什么?
有时候仅需要描述一组对象的属性而无需知道其实际的行为,抽象类(abstract class)的方法和构造函数在扩展类中使用,扩展类可以通过抽象类(abstract class)共享方法。

10、用来建立scoreboard的数据结构是什么?
队列(Queue)

11、与队列(Queue)相对比,链表(linked-list)的优点是什么?
队列有固定的顺序,很难将数据插入队列中,但是链表可以轻松的将数据插入任何位置。

12、$random 和 $urandom 有什么区别?
$random 系统函数每次调用时都会返回一个32位带符号的随机数。
$urandom 系统函数每次调用时都会返回一个32位无符号的随机数。

13、列出预定义(predefined)的随机方法
(1)randomize
(2)pre_randomize
(3)post_randomize

14、package的用途是什么?
在Verilog中,模块内变量/任务/函数的声明特定于模块(module),SV中package结构允许声明全局变量/任务/函数,从而在module/classes之间使用。

package可以包含module/class/function/task/constraints/cover group等声明,在使用时需要使用范围解析运算符(::)或者import来访问package中的内容。

package ABC
      typedef enum {RED, GREEN, YELLOW} Color;
      void function do_nothing()
      endfunction
endpackage:ABC

import ABC :: Color;      
import ABC :: *; //import everything inside the package    

15、program和module的区别?
program是在SV中新添加的,用于以下目的:

(1)分离testbench与DUT(design under test,待测设计)
(2)有助于确保testbench和DUT没有竞争冒险(race condition)
(3)提供了执行testbench的入口点
(4)通过(program…endprogram)指定了reactive region的调度

module和program之间主要的区别在于
(1)program内部不能包含always语句块,而module可以
(2)program中不能包含UDP,module或者其他program实例,而module可以
(3)program在调度队列的re-active中执行,module在active region中执行
(4)program可以调用module胡总和其他program中task或者function,但是module不能调用program中task或者function。

16、如何在program语句块中实现always语句块?

always @(posedge clk or negedge reset)begin
    if(!reset)begin
    data <= '0;
    end else begin
    data <= data_next;
    end
end    

//using forever: slightly complex but doable
forever begin
       fork 
       begin
              @(negedge reset);
                data <= '0;
        end
        begin
                @(posedge clk);
                if(!reset)      data <= '0;
                else           data <= data_next;
         end
         join_any
         disable fork
end    `

17、

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
序列检测器是一种电路,用于检测输入信号序列是否符合某种特定的模式。在Verilog HDL语言中,可以使用状态机来实现序列检测器。以下是一个简单的序列检测器的Verilog HDL代码示例: ```verilog module sequence_detector( input clk, // 时钟信号 input reset, // 复位信号 input data, // 输入数据信号 output reg match // 匹配信号 ); // 定义状态 typedef enum logic [1:0] { STATE_IDLE, // 空闲状态 STATE_S1, // 状态1 STATE_S2, // 状态2 STATE_S3 // 状态3 } state_t; // 定义状态转移表 parameter [3:0] TRANS_TABLE [0:3] = '{4'b0000, 4'b0001, 4'b0010, 4'b0100}; // 定义当前状态变量和下一个状态变量 reg [1:0] state, next_state; // 初始化状态为IDLE initial begin state = STATE_IDLE; end // 定义状态机逻辑 always @ (posedge clk, posedge reset) begin if (reset) begin state <= STATE_IDLE; end else begin state <= next_state; end end // 定义状态转移逻辑 always @ (*) begin case (state) STATE_IDLE: begin if (data) begin next_state = STATE_S1; end else begin next_state = STATE_IDLE; end end STATE_S1: begin if (!data) begin next_state = STATE_IDLE; end else if (data) begin next_state = STATE_S2; end end STATE_S2: begin if (!data) begin next_state = STATE_IDLE; end else if (data) begin next_state = STATE_S3; end end STATE_S3: begin if (!data) begin next_state = STATE_IDLE; match = 1; end else begin next_state = STATE_S3; end end endcase end endmodule ``` 这个序列检测器可以检测输入数据信号是否符合“1101”这个模式。输入数据信号通过data端口输入,匹配结果通过match端口输出。当输入数据信号符合“1101”这个模式时,match信号会被置为1。如果输入数据信号不符合模式,match信号会保持为0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值