【IC验证面试常问问题-2】

IC验证面试常问问题

  • 1 SV基础语法类
    • 1.1 Task和Function的区别
    • 1.2 OOP的特性
    • 1.3 在TB中使用interface和clocking blocking的好处
    • 1.4 SV中ref参数传递--引用
    • 1.5 SV类中的this是什么?super是什么?

【博客首发与微信公众号《漫谈芯片与编程》,欢迎专注一下】
本篇博客继续介绍IC验证常问问题;

1 SV基础语法类

1.1 Task和Function的区别

task和function都是用来封装代码块,来定义可重用的代码块;
task:用于定义一个可重用一系列操作的代码块,可能需要耗费时间;
1.可以包含延迟、事件触发和其他复杂的控制结构;
2.可以有输入参数和输出参数,也可以没有参数;
3.可以调用其他task或function.
function:用于定义一个可以执行一系列操作并返回一个值的代码块。不耗时间;
1.通常用于执行一些计算或逻辑操作,并返回结果;
2.可以有输入参数,但不能有输出参数;
3.可以调用其他function,但不能调用task;

// 定义一个 function,返回两个整数的和
function int add(int a, int b);return a + b;
endfunction// 定义一个 task,打印两个整数的和,并等待一段时间
task print_sum_and_wait(int a, int b);#10;  // 等待 10 时间单位$display("The sum is: %0d", a + b);  // 打印结果
endtaskmodule tb;initial beginint result;result = add(5, ¾);  // 调用 function 并将结果赋值给 result$display("The sum is: %0d", result);  // 输出结果print_sum_and_wait(5, ¾);  // 调用 task$display("After the task");  // 这条语句会在 task 执行完毕后执行end
endmodule

1.2 OOP的特性

面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它通过“对象”来组织代码,这些对象是数据和对这些数据执行操作的封装。OOP 的核心思想是将现实世界中的实体抽象成程序中的对象,从而提高代码的复用性、模块化和可维护性。这些对象是类的实例,类定义了对象的属性(数据)和行为(方法)。
1.封装:将数据(属性)和操作这些数据的方法(行为)捆绑在一起,形成一个独立的实体(对象)。这样可以隐藏对象的内部实现细节,只通过对象提供的方法来访问和修改数据,提高了代码的安全性和可维护性。
实现机制支持:在SV中提供了class类的封装机制;类的属性和方法可以设置为 public、protected 或 local,从而控制其访问级别。

class Counter;local int count;  // 局部变量,外部不可访问function new(int init_value);count = init_value;endfunctionfunction void increment();count++;endfunctionfunction int get_count();return count;endfunction
endclass

2.继承:允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以重用代码,减少重复,并且可以构建类的层次结构,使得代码更加清晰和易于理解。派生类可以添加新的属性和方法,或者重写基类的方法。
实现机制支持:使用 extends 关键字来实现继承;

class Animal;virtual function void make_sound();$display("Some generic sound");endfunction
endclassclass Dog extends Animal;function void make_sound();$display("Woof woof!");endfunction
endclassmodule tb;initial beginAnimal a = new();Dog d = new();a.make_sound();  // 输出 "Some generic sound"d.make_sound();  // 输出 "Woof woof!"end
endmodule

3.多态:同一个方法调用可以有不同的行为实现,允许不同类的对象通过相同的接口调用;这通常通过继承和接口实现来完成,具体是方法重载(overloading)和方法重写(overriding)来实现。多态使得代码更加灵活,可以根据对象的实际类型来执行不同的操作。
实现机制支持:在 SystemVerilog 中,多态通过虚方法(virtual method)和动态绑定(dynamic binding)来实现;

class Shape;virtual function real area();return 0.0;endfunction
endclassclass Circle extends Shape;real radius;function new(real r);radius = r;endfunctionfunction real area();return 3.14 * radius * radius;endfunction
endclassclass Rectangle extends Shape;real width, height;function new(real w, real h);width = w;height = h;endfunctionfunction real area();return width * height;endfunction
endclassmodule tb;initial beginShape s1 = new();Shape s2 = new Circle(5.0);Shape s3 = new Rectangle(4.0, 6.0);$display("Area of shape 1: %f", s1.area());  // 输出 0.0$display("Area of shape 2: %f", s2.area());  // 输出 78.500000$display("Area of shape 3: %f", s3.area());  // 输出 24.000000end
endmodule

4.抽象:忽略对象的复杂细节,只关注其基本特征和功能。抽象类和接口是实现抽象的两种方式,它们定义了一组方法的签名,但不提供具体实现,由子类或实现类来提供具体实现。
实现机制支持:在SV中,使用纯虚方法(pure virtual method)来实现抽象。

virtual class Shape;pure virtual function real area();
endclassclass Circle extends Shape;real radius;function new(real r);radius = r;endfunctionfunction real area();return 3.14 * radius * radius;endfunction
endclassclass Rectangle extends Shape;real width, height;function new(real w, real h);width = w;height = h;endfunctionfunction real area();return width * height;endfunction
endclassmodule tb;initial beginShape s1 = new Circle(5.0);Shape s2 = new Rectangle(4.0, 6.0);$display("Area of shape ¼: %f", s1.area());  // 输出 78.500000$display("Area of shape 2: %f", s2.area());  // 输出 24.000000end
endmodule

总结:
封装:将数据和操作数据的方法绑定在一起,隐藏内部实现细节。
继承:创建新类时继承现有类的属性和方法,提高代码复用性。
多态:不同类的对象通过相同的接口调用,表现出不同的行为,提高代码灵活性。
抽象:从具体实例中提取共同特征和行为,形成抽象概念,提高代码的可读性和可维护性。

1.3 在TB中使用interface和clocking blocking的好处

  • Interface提供了一种模块化的方式来定义信号和它们的行为。这使得TB的设计更加模块化,易于维护和重用;
  • Clocking blocking是interface的一个特性,它允许在时钟边沿同步地驱动和采样信号,这有助于确保信号的时序正确性。避免TB与 DUT的接口竞争,减少我们由于信号竞争导致的错误。采样提前,驱动落后,保证信号不会出现竞争。
    接口既可以在硬件世界(module)中使用,又可以在软件世界(class)中使用,interface作为SV中唯—的硬件和软件环境的媒介交互,解耦了硬件与软件;接口由于可以例化的特性, 使得对于多组相同的总线, 在例化和使用时变得更加灵活,不仅使得代码变得简洁, 也更易于验证环境的管理和维护。
interface my_interface(input logic clk, input logic rst_n);logic [7:0] data;logic valid;// 时钟块clocking cb @(posedge clk);output data, valid;endclocking// 时序断言property data_valid;@(posedge clk) disable iff (!rst_n) valid |-> data inside {8'h00, 8'hFF};endpropertyassert property (data_valid) else $error("Data valid assertion failed");endinterfacemodule tb;logic clk, rst_n;my_interface intf(clk, rst_n);// 时钟生成always #5 clk = ~clk;initial beginclk = 0;rst_n = 0;#10 rst_n = 1;// 使用时钟块驱动信号intf.cb.data <= ˜h55;intf.cb.valid <= 1;@(posedge clk);intf.cb.data <= ˜hAA;intf.cb.valid <= 0;@(posedge clk);$finish;end
endmodule

1.4 SV中ref参数传递–引用

ref参数传递:是一种将参数作为引用传递给函数或任务的方式。这意味着函数或任务内部对参数的修改会反映到函数或任务外部的原始变量上–操作同一块内存;
主要好处有:
1.修改原始数据:使用ref参数传递,函数或任务可以修改传入的参数值,如果不希望子程序改变数组的值,可以使用const ref类型。
2.减少内存使用:ref参数传递避免了复制大型数据结构的需要,因为参数是通过引用传递的,而不是通过值传递的。这可以减少内存使用和提高性能。
3.简化代码:避免返回值处理和额外的变量声明;

typedef struct {int id;string name;
} person;module tb;initial beginperson p;p.id = 1;p.name = "Alice";$display("Before: ID = %0d, Name = %s", p.id, p.name);modify_person(p);$display("After: ID = %0d, Name = %s", p.id, p.name);end// 使用 ref 参数修改结构体成员function void modify_person(ref person p);p.id = 2;p.name = "Bob";endfunction
endmodule

1.5 SV类中的this是什么?super是什么?

this:这个指针指向当前类的实例。它允许你在类的方法内部引用当前实例的成员,包括变量和方法。使用this可以避免在类的内部方法中对成员的引用产生歧义,特别是当方法的参数或局部变量与类的成员具有相同的名称时。

super:这个指针指向当前类的父类实例。它允许你在子类中调用父类的方法或访问父类的成员。使用super可以确保在子类中调用的是父类的方法,而不是子类中同名的方法。这在实现继承和方法重写时非常有用。

class Animal;string type;// 构造函数function new(string t);type = t;endfunction// 方法function void display();$display("Name: %s, Age: %0d", this.name, this.age);endfunction// 方法virtual function void make_sound();$display("Some generic sound");endfunction
endclassclass Dog extends Animal;// 构造函数function new(string t);super.new(t);  // 调用父类的构造函数endfunction// 重写父类的方法function void make_sound();super.make_sound();  // 调用父类的方法$display("Woof woof!");endfunction
endclassmodule tb;initial beginDog d = new("Canine");d.make_sound();  // 输出: Some generic sound//       Woof woof!end
endmodule

语法类除了文字介绍外,看示例代码帮助理解;
【REF】
1.https://blog.csdn.net/graymount/article/details/121391722
2.https://www.nowcoder.com/discuss/445245619951734784

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LLM】Agentic Workflow的四种常见思路

note Reflection 和 Tool Use 属于比较经典且相对已经广泛使用的方式&#xff0c;Planning 和 Multi-agent 属于比较新颖比较有前景的方式。 文章目录 note一、四种设计模式1. Reflection2. Tool use3. Planning4. Multi-agent collaboration 二、相关代码实践 一、四种设计模…

Python数据可视化seaborn

产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…

基于ssm的个人健康管理系统

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

CSS3新增渐变(线性渐变、径向渐变、重复渐变)

1.线性渐变 代码&#xff1a; 效果图&#xff1a; 使文字填充背景颜色&#xff1a; 效果图&#xff1a; 2.径向渐变 代码&#xff1a; 效果图&#xff1a; 代码图&#xff1a; 效果图&#xff1a; 3.重复渐变 代码&#xff1a; 效果图&#xff1a;

[mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关

1DML数据操作语言,增加删除改数据 插入数据INSERT 插入添加数据,两种方法 方式1:VALUES添加数据 #准备工作 USE atguigudb; CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_data DATE, salary DOUBLE(10,2)); SELECT * FROM emp1 INSERT INTO em…

自由学习记录(19)

unity核心也算是看完了吧&#xff0c;但觉得的确是少了点东西&#xff0c;之后再看mvc框架&#xff0c;和网络开发&#xff0c;&#xff0c;感觉有必要想想主次顺序了&#xff0c;毕竟在明年的3月之前尽量让自己更有贴合需求的能力 先了解一些相关概念&#xff0c;不用看懂&am…

vue计算属性

概念&#xff1a;基于现有的数据&#xff0c;计算出来新属性。并依赖数据的变化&#xff0c;自动重新计算 使用场景&#xff1a; 语法&#xff1a;声明在computed配置项中&#xff0c;一个计算属性对应一个函数&#xff0c;使用起来和普通属性一样使用{{计算属性名}} 代码&…

springboot2.x使用SSE方式代理或者转发其他流式接口

文章目录 1.需求描述2.代码2.1.示例controller2.2.示例service2.3.示例impl 3.测试 1.需求描述 使用SSE的方式主要还是要跟前端建立一个EventSource的链接&#xff0c;有了这个连接&#xff0c;然后往通道里写入数据流&#xff0c;前端自然会拿到流式数据&#xff0c;写啥拿啥…

Hive操作库、操作表及数据仓库的简单介绍

数据仓库和数据库 数据库和数仓区别 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别 操作型处理(数据库)&#xff0c;叫联机事务处理OLTP&#xff08;On-Line Transaction Processing&#xff09;&#xff0c;也可以称面向用户交易的处理系统&#xff0c;它是针对具体业务…

Ubuntu22.04 安装图形界面以及XRDP教程

一、准备环境 1.一台服务器安装系统ubuntu&#xff08;这里大部分ubuntu系统可以同用&#xff09; 2.安装的ubuntu系统未安装图形界面 二、操作步骤 1.远程ssh或者直接登录服务器命令行界面 ssh -p 远程端口 rootIP 2.更新系统软件包 sudo apt update # 更新本地的软件包…

C++:多态中的虚/纯虚函数,抽象类以及虚函数表

我们在平时&#xff0c;旅游或者是坐高铁或火车的时候。对学生票&#xff0c;军人票&#xff0c;普通票这些概念多少都有些许耳闻。而我们上篇文章也介绍过了继承与多继承。如果这些票我们都分别的去写一个类&#xff0c;当然很冗余&#xff0c;这里我们便可以去使用继承&#…

【易售校园二手平台】开源说明(包含项目介绍、界面展示与系列文章集合)

文章目录 仓库项目介绍技术架构界面登录界面首页闲置商品发布商品详情收藏页面消息页面私聊我的查看我发布的商品 可优化点开发讲解文章集合 仓库 &#x1f3e0;️ 项目仓库&#xff1a;易售校园二手平台gitee仓库 &#x1f30d;️ 在线体验&#xff1a;易售校园二手平台&…

python怎么将字符串转换为数字

python如何将列表中的字符串转为数字&#xff1f;具体方法如下&#xff1a; 有一个数字字符的列表&#xff1a; numbers [1, 5, 10, 8] 想要把每个元素转换为数字&#xff1a; numbers [1, 5, 10, 8] 用一个循环来解决&#xff1a; new_numbers []; for n in numbers:new_n…

APP 后台广告位配置的关键要素与策略

在当今数字化营销的浪潮中&#xff0c;APP 作为重要的信息传播渠道&#xff0c;其后台广告位的配置显得尤为关键。这不仅影响着广告的展示效果&#xff0c;还直接关系到用户体验和平台收益。 首先&#xff0c;了解目标受众是配置广告位的基础。通过对 APP 用户的行为数据进行分…

创建MoveIt! Package

2.1 准备URDF package 首先我们要准备一个机械臂的urdf&#xff0c;如果你已有URDF&#xff0c;可以使用自己的urdf模型。若手头没有现成的URDF&#xff0c;可以从此处下载一个库卡LWR简化模型URDF&#xff0c;这是一个固定底座7自由度的机械臂。 从该连接处依次进入examples/s…

穴位大揭秘:使用「人体穴位图解」,轻松学会精准按摩技巧

软件介绍 人体穴位图解是一款免费无广提供人体穴位图解、人体经络病症及穴位图表的应用&#xff0c;采用目前流行的Flutter框架开发&#xff0c;遍布肺、肠、脾、胃、心、肝等部位。该应用所有资料均来自相关公共医学文献&#xff0c;具有一定的参考价值&#xff0c;通过图文介…

c++算法练习(3)石头剪刀布、输出亲朋字符串、配对碱基对、标准库的字符替换、密码翻译

#include <string>vector<string>results;results.push_bask(string1);for(const auto &result :result)//字符串可以用下表访问string myString;string.length()ss.replace(ss,find(A),1,T);char operator()(char ch) const class SomeClass {private:int mem…

SpringBoot二手车交易管理系统-计算机毕业设计源码02893

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2开发现状 1.3论文结构与章节安排 2 二手车交易管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例…

Linux scp命令 | 菜鸟教程-从本地复制到远程/从远程复制到本地

目录 Linux scp命令 语法 实例 1、从本地复制到远程 2、从远程复制到本地 说明 文章来源&#xff1a;Linux scp命令 | 菜鸟教程 Linux scp命令 nux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远…

linux node vue3 部署手册

第一步&#xff1a;在linux 系统中安装node 1、在网址&#xff1a;https://nodejs.org/dist/ 下载对应版本的安装包。 2、解压缩下载的压缩包到任意位置&#xff0c;推荐home下。 样例路径为&#xff1a;/home/syl/node-v20.17.0-linux-x64.tar.xz 样例&#xff1a; tar -xv…