【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,一经查实,立即删除!

相关文章

springboot中使用jdbc查询数据库列表时,会出现数据库null值转换过程,很容易出现的错误

在springboot中使用jdbc查询数据库列表时&#xff0c;会出现数据库null转换的过程&#xff0c;这个过程很容易出现意想不到的错误&#xff1f; 比如&#xff1a;使用场景中的jdbcTemplate要查询某列表 return jdbcTemplate.query(sql.getSql(), sql.getParamter(), new BeanP…

【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;

【Kubernets】Kubernets进阶-Ingress配置SSL证书

Ingress配置SSL证书 1. 准备 SSL 证书和私钥2. 创建 Kubernetes Secret3. 配置 Ingress 资源4. 应用 Ingress 配置5. 验证配置注意事项 自签名证书在Ingress中如何应用?相关文献 在 Kubernetes 中&#xff0c;Ingress 资源可以用来管理外部访问到集群内服务的 HTTP 流量&#…

wvp 推拉转级联时频繁出现流无法观看的解决办法

经观察&#xff0c;推拉转任务在两三天时间内就失效了。 1 用脚本每天定时启动一次 wvp docker 容器, 并关闭所有推拉转任务&#xff0c;建议每天凌晨2点运行 import subprocess import time import socket import requestsdef restart_container(container_name):subprocess…

[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;使用起来和普通属性一样使用{{计算属性名}} 代码&…

Promise 简单介绍及深入挖掘

一、什么是 Promise&#xff1f; 在 JavaScript 中&#xff0c;Promise 是用于处理异步操作的一种方式。它代表了一个 可能 在将来某个时间点完成或失败的操作的结果。Promise 使得我们能够优雅地处理异步代码&#xff0c;避免了回调地狱&#xff08;Callback Hell&#xff09;…

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

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

Java学习教程,从入门到精通,Java方法语法的知识点总结(21)

1、Java方法语法的知识点总结 方法定义&#xff1a; 方法是执行特定任务的代码块。 方法包含一个方法头和一个方法体。 语法&#xff1a; [修饰符] 返回值类型 方法名(参数列表) {// 方法体 }修饰符&#xff1a; 访问修饰符&#xff08;如 public, private, protected&#x…

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

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

C#语言在软件开发中的应用与优势

C#&#xff08;读作“C-sharp”&#xff09;是一种由微软公司开发的通用高级编程语言&#xff0c;自2000年发布以来&#xff0c;它迅速成为开发人员构建各种类型应用程序的首选语言之一。C#的设计目标是成为一种简单、现代、面向对象的语言&#xff0c;它结合了C的强大功能和Ja…

基于STM32的智能植物灌溉系统设计

引言 本项目基于STM32微控制器设计了一个智能植物灌溉系统&#xff0c;通过集成土壤湿度传感器和水泵&#xff0c;实现植物自动浇水的功能。该系统可以检测土壤的湿度状况&#xff0c;根据设定的湿度阈值自动启动或停止灌溉&#xff0c;为植物提供适宜的生长环境。项目涉及硬件…

OpenStack API 来创建用户

OpenStack API 来创建用户。 代码详解 import requests import jsonrequests&#xff1a;用于发送 HTTP 请求的库。json&#xff1a;用于处理 JSON 数据格式的库。 controller_ip 10.104.43.10 url f"http://{controller_ip}:5000/v3/auth/tokens"controller_ip…

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;易售校园二手平台&…