【IC验证】verilog及systemverilog特殊特性的分析

news2025/1/4 18:34:03

verilog及systemverilog特殊特性的分析

  • 1.概述
  • 2.赋值延迟
    • (0)总结
    • (1)情况一:initial中进行阻塞赋值和非阻塞赋值(不延迟)
      • a代码
      • b 电路图
      • c 结果
    • (2)时钟
      • a 代码
      • b 电路图
      • c 结果
    • (3)always过程块实现时序逻辑(延迟)
      • a 代码
      • b 电路图
      • c 结果
    • (4)always过程块实现组合逻辑(延迟)
      • a 代码
      • b 电路图
      • c 结果
    • (5)assign连续赋值语句实现组合逻辑(延迟)
      • a 代码
      • b 电路图
      • c 结果
    • (6)接口中的时钟(延迟)
      • a 代码
      • b 电路图
      • c 结果
    • (7)触发事件(延迟)
      • a代码
      • b 电路图
      • c 结果
  • 3.仿真软件的采样时刻
    • (1)在过程块中:时钟触发沿和数据改变沿同时刻
      • a代码
      • b结果
    • (2)在clocking block中:时钟触发沿和数据改变沿同时刻(完全一致)
      • a代码
      • b结果
  • 4.并行块代码的执行
    • 1.代码的执行时间(按照仿真结果总结出的,不具有理论依据)
  • 5.对模块中成员的调用
    • (1)问题
    • (2)例子(以模块为例)
  • 6.模块和类的静态与动态

1.概述

本文主要汇总分析verilog及systemverilog学习过程中出现的特殊问题;

2.赋值延迟

(0)总结

always过程块实现时序逻辑和组合逻辑和连续赋值语句赋值要消耗仿真时间;
接口内部的时钟,会比外部提供的时钟,存在延迟;
触发事件,@xxx,存在延迟;

(1)情况一:initial中进行阻塞赋值和非阻塞赋值(不延迟)

a代码

module test_tb;
    reg [3:0]   data1;
    reg [3:0]   data2;
    initial begin
        data1 = 0;
        data2 <= 0;
        #5;
        data1 = 1;
        data2 <= 1;
    end
endmodule

b 电路图

initial过程块不可综合;

c 结果

结论:initial过程块中直接赋值不消耗时间;
在这里插入图片描述

(2)时钟

a 代码

module test_tb;
	reg clk;
    initial begin
        clk = 1'b0;
    end
    always#(10) clk = !clk;
endmodule

b 电路图

延时语句不可综合;

c 结果

结论:时钟赋值不消耗时间;
在这里插入图片描述

(3)always过程块实现时序逻辑(延迟)

a 代码

module test_tb;
	parameter T =20;
    reg clk;
    reg rst_n;
    initial begin
        clk = 1'b0;
        rst_n = 1'b0;
        #(T);
        rst_n = 1'b1;
    end
    always#(T/2) clk = !clk;
    reg [3:0] cnt1;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            cnt1 <= 'd0;
        else
            cnt1 <= cnt1+1'b1;
    end
endmodule

b 电路图

在这里插入图片描述

c 结果

结论:综合出寄存器,赋值需要消耗时间;
在这里插入图片描述

(4)always过程块实现组合逻辑(延迟)

a 代码

module test_tb;
	parameter T =20;
    reg clk;
    reg rst_n;
    initial begin
        clk = 1'b0;
        rst_n = 1'b0;
        #(T);
        rst_n = 1'b1;
    end
    always#(T/2) clk = !clk;
    reg [3:0] cnt1;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            cnt1 <= 'd0;
        else
            cnt1 <= cnt1+1'b1;
    end
    reg [3:0] cnt2;
    always@(*)begin
        cnt2 = cnt1;
    end
endmodule

b 电路图

在这里插入图片描述

c 结果

结论:综合出数据线,赋值需要消耗时间
在这里插入图片描述

(5)assign连续赋值语句实现组合逻辑(延迟)

a 代码

module test_tb;
	parameter T =20;
    reg clk;
    reg rst_n;
    initial begin
        clk = 1'b0;
        rst_n = 1'b0;
        #(T);
        rst_n = 1'b1;
    end
    always#(T/2) clk = !clk;
    reg [3:0] cnt1;
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n)
            cnt1 <= 'd0;
        else
            cnt1 <= cnt1+1'b1;
    end
    wire [3:0] cnt2;
    assign cnt2 = (cnt1 == 1)?1'b1:1'b0;

endmodule


b 电路图

在这里插入图片描述

c 结果

结论:综合出组合逻辑电路,赋值需要消耗时间
在这里插入图片描述

(6)接口中的时钟(延迟)

a 代码

interface my_if(input bit clk);
    bit [7:0] sig1;
    bit [7:0] sig2;
    clocking cb@(posedge clk);
        input sig1;
        output sig2;
    endclocking 
endinterface 
module test_blocking1_test;
    reg clk;
    my_if mif(clk);
    initial begin
        clk = 0;
    end
    always#3 clk = !clk;

endmodule

b 电路图

不可综合语句;

c 结果

结论:
接口中的时钟跳变,会比顶层时钟跳变,延迟;

(7)触发事件(延迟)

a代码

module test_tb;
    parameter T = 20;
    reg clk;
    reg rst_n;
    reg cnt;
    initial begin
        clk = 0;
        rst_n = 0;
        cnt = 0;
        #(T);
        rst_n = 1;
        #(T);
        @(posedge clk);
        cnt = 1;
    end
    always#(T/2) clk = !clk;

endmodule

b 电路图

不可综合语句;

c 结果

在这里插入图片描述

3.仿真软件的采样时刻

(1)在过程块中:时钟触发沿和数据改变沿同时刻

a代码

说明:时钟clk1T/2倍数处改变,输入数据in1 也在T/2倍数处改变;

module test_tb;
    parameter T = 20;
    reg             clk1;
    reg     [3:0]   in1;
    reg             rst_n;
    initial begin
        clk1 = 1'b0;
        rst_n = 1'b0;
        in1  = 'd0;
        #(T);
        rst_n = 1'b1;
    end
    always#(T/2) in1 = in1 + 1'b1;
    always#(T/2) clk1 = !clk1;
    reg [3:0] data_out1;
    always@(posedge clk1 or negedge rst_n)begin
        if(!rst_n)
            data_out1 <= 'd0;
        else 
            data_out1 <= in1;
    end

endmodule

b结果

questasim:
结论:仿真器采样为数据跳变沿右侧的值;
在这里插入图片描述
vcs(DVE):
结论:仿真器采样为数据跳变沿右侧的值;
在这里插入图片描述
vcs(verdi):
结论:仿真器采样为数据跳变沿右侧的值;
在这里插入图片描述

(2)在clocking block中:时钟触发沿和数据改变沿同时刻(完全一致)

a代码

在这里插入图片描述

b结果

questasim:
结论:仿真器采样为采样时刻左侧的值;
在这里插入图片描述
vcs(DVE):
结论:仿真器采样为采样时刻右侧的值;
在这里插入图片描述

vcs(verdi):
结论:仿真器采样为采样时刻右侧的值;
在这里插入图片描述

说明:时钟clk13倍数处改变,输入数据sig1 第二次变化在时钟跳变沿处改变;


为什么两种clk翻转时刻不同???

4.并行块代码的执行

1.代码的执行时间(按照仿真结果总结出的,不具有理论依据)

(1)在verilog实现的硬件电路中,同一时刻不同过程块中的并行语句,是并行执行;
(2)在verilog和systemverilog仿真时,同一时刻同一过程块中的串行语句,是串行执行;
见例子1中,“aaa”、“bbb”、“ccc”的打印语句,是同一过程块中的串行语句,是串行执行;
(3)在verilog和systemverilog仿真时,同一时刻不同过程块中的并行语句,是串行执行;
见例子1中“aaa”、“bbb”、“ccc”三个打印语句和"eee"打印语句,是不同过程块中的并行语句,所以会串行执行;
(因为“aaa”、“bbb”、“ccc”打印语句过程块在前,优先打印)
(4)在verilog和systemverilog仿真时,部分语句会消耗一个很小的时刻的;
如:“#”
见例子2中,两过程块均延时1个时间单位,然后分别打印aaaccc,所以结果aaa在前、ccc在后;
而在第一个过程块中通过执行两次**#1表示延迟两个时间单位,第二个过程块通过执行一次#2同样表示延迟两个时间单位。但是过程块1用了两次#会消耗两个很小的时刻,过程块2只用了1次#只会消耗1个很小的时刻,所以会先打印ddd再打印bbb**
(5)例子
例子1

module test_ft_tb;
    initial begin
        $display("aaa");
        $display("bbb");
	$display("ccc");
        #10;
        $display("ddd");
    end
    initial begin
	$display("eee");
        #10;
        $display("fff");
    end
endmodule

结果:
在这里插入图片描述
例子2

module test_ft_tb;
    initial begin
        #1;
        $display("aaa");
	#1;
	#1;
        $display("bbb");
    end
    initial begin
        #1;
        $display("ccc");
	#2;
	$display("ddd");
    end
endmodule

结果:
在这里插入图片描述

5.对模块中成员的调用

(1)问题

systemverilog中,在一个区域中,声明了一个类(或模块),那么在这个区域中就可以调用这个类(或模块)中的成员(变量和方法);

(2)例子(以模块为例)

代码:

module add_module;
    int data_arr [$];
    task automatic get_data(input int data_in);
        data_arr.push_back(data_in);
    endtask 
    task automatic add_data(output int add_re);
        foreach(data_arr[i])begin
            add_re = add_re + data_arr[i];
        end
    endtask
endmodule
module test_ft_tb1;
   add_module u1();
   initial begin
        int re;
        u1.get_data(1);
        u1.get_data(2);
        u1.get_data(3);
        $display("data_arr = %p",u1.data_arr);
        u1.add_data(re);
        $display("result is %0d",re);
   end
endmodule

结果:
在这里插入图片描述

6.模块和类的静态与动态

模块是静态的,创建于编译时刻;
类是动态的,创建于实例化时刻。

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

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

相关文章

FPGA流水线考虑因素

流水线考虑因素 另一种提升性能的方法是对拥有多个逻辑级数的长数据路径进行重新组织&#xff0c;并将其分配在多个时钟周期上。这种方法 以时延和流水线开销逻辑管理为代价&#xff0c;来达到加快时钟周期和提高数据吞吐量的目的。 由于 FPGA 器件带有大量的寄存器&#x…

关于 PCB线路板细节锣槽问题 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144783817 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

SQL创建和操纵表

本文介绍创建、更改和删除表的基本知识。 1. 创建表 SQL 不仅用于表数据操纵&#xff0c;而且还用来执行数据库和表的所有操作&#xff0c;包括表本身的创建和处理。一般有两种创建表的方法&#xff1a; 多数DBMS 都具有交互式创建和管理数据库表的工具&#xff1b;表也可以…

RPA系列-uipath 学习笔记4

使用Uipath 处理hover的问题 备注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有学习来源自uipath Academy 首先&#xff0c;打开uipath给我们提供的一个网站 ACME,这个网站呢&#xff0c;需要提前注册一下的哈。 今天呢&#xff0c;就是记录一下&#xff0c;怎…

Unity编译Android apk包进度奇慢或gradle报错的解决方案

最近遇到Unity编译Android apk进度卡在"Calling IPostGenerateGradleAndroidProject callbacks"进度一直不变&#xff0c;如下图&#xff1a; 最后提示编译失败&#xff0c;类似错误如下&#xff1a; Picked up JAVA_TOOL_OPTIONS: -Dfile.encodingUTF-8FAILURE: Bu…

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…

CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读

24年5月的论文&#xff0c;上一版就是ReconFusion 目录 一、概述 二、相关工作 1、2D先验 2、相机条件下的2D先验 3、多视角先验 4、视频先验 5、前馈方法 三、Method 1、多视角扩散模型 2、新视角生成 3、3D重建 一、概述 该论文提出一种CAT3D方法&#xff0c;实现…

模型工作流:自动化的模型内部三角面剔除

1. 关于自动减面 1.1 自动减面的重要性及现状 三维模型是游戏、三维家居设计、数字孪生、VR/AR等几乎所有三维软件的核心资产&#xff0c;模型的质量和性能从根本上决定了三维软件的画面效果和渲染性能。其中&#xff0c;模型减面工作是同时关乎质量和性能这两个要素的重要工…

黑马程序员Java笔记整理(day08)

1.代码块 静态代码块 实例代码块 2.内部类 成员内部类 静态内部类 局部内部类 匿名内部类 认识 常见使用形式 应用场景 简化版本 另一个应用场景 3.函数式编程 Lambda 函数简化 方法引用 4.常用API String ArrayList 5.GUI编程 快速认识 事件处理 三种常用写法 第一种 第二…

redis延迟队列

Redis延迟队列 Redis延迟队列是基于Redis构建的消息队列&#xff0c;用来处理需延迟执行的任务。 基本原理 它借助Redis的有序集合&#xff08;Sorted Set&#xff09;数据结构达成目的。会把任务及其执行时间分别当成成员与分值存进有序集合&#xff0c;由于执行时间作为分值&…

爱思唯尔word模板

爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接

【JDBC】入门增删改查

JDBC JDBC概述 JDBC&#xff08;Java DataBase Connectivity, java数据库连接&#xff09;是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范&#xff0c;可以为不同的关系型数据库提供统一访问&#xff0c;它由一组用Java语言编写的接口和类组成。 XML方式…

Java开发-后端请求成功,前端显示失败

文章目录 报错解决方案1. 后端未配置跨域支持2. 后端响应的 Content-Type 或 CORS 配置问题3. 前端 request 配置问题4. 浏览器缓存或代理问题5. 后端端口未被正确映射 报错 如下图&#xff0c;后端显示请求成功&#xff0c;前端显示失败 解决方案 1. 后端未配置跨域支持 …

Dify服务器部署教程

Dify的github地址: https://github.com/langgenius/dify 服务器要求&#xff1a;2c4g 1、克隆仓库 可以通过命令或者下载zip解压后上传服务器都行 git clone https://github.com/langgenius/dify.git 2、docker启动 cd dify/dockercp .env.example .envdocker compose up -d…

砝码称重(2021年蓝桥杯)

【问题描述】 你有一架天平和N个砝码&#xff0c;这N个砝码的重量依次是w1,w2,……,wn。&#xff08;1~n为下标&#xff09; 请你计算利用N个砝码一共可以称出多少种不同的重量&#xff1f; 【注意】砝码可以放在天平的两边 【输入格式】 第一行包含一个整数N。 第二行包含N个…

KaiOS 4.0 | DataCall and setupData implemention

相关文档 1、KaiOS 3.1 系统介绍 KaiOS 系统框架和应用结构(APP界面逻辑)文章浏览阅读842次,点赞17次,收藏5次。对于Java开发者而言,理解JS的逻辑调用是有点困难的。而KaiOS webapp开发又不同于现代的web开发,更像chrome浏览器内嵌模式。在这里梳理一下kaios平台web应用…

ArcGIS Pro地形图四至角图经纬度标注与格网标注

今天来看看ArcGIS Pro 如何在地形图上设置四至角点的经纬度。方里网标注。如下图的地形图左下角经纬度标注。 如下图方里网的标注 如下为本期要介绍的例图&#xff0c;如下&#xff1a; 图片可点击放大 接下来我们来介绍一下 推荐学习&#xff1a;GIS入门模型构建器Arcpy批量…

win系统B站播放8k视频启用HEVC编码

下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads&#xff0c;根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent 在youtube中会导致视频无法播放&#xff0c;我选择直接屏蔽了 B站设置

mysql锁机制以及隔离级别下保证并发安全的方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 mysql锁机制以及隔离级别下保证并发安全的方式 多事务并发执行可能出现的问题mysql有那些锁全局锁表级锁行锁 在不同的隔离级别下mysql保证并发安全的方式RU隔离级别RC隔离级…

qwenvl 以及qwenvl 2 模型架构理解

qwenvl 模型理解&#xff1a; 参考资料&#xff1a; https://qwenlm.github.io/zh/blog/qwen2-vl/ https://github.com/QwenLM/Qwen2-VL?tabreadme-ov-file https://qwenlm.github.io/zh/blog/qwen2-vl/ 论文&#xff1a; qwenvl https://arxiv.org/abs/2308.12966 Qwen2-VL …