SystemVerilog基础:disable fork语句

相关阅读

SystemVerilog基础https://blog.csdn.net/weixin_45791458/category_12517449.html?spm=1001.2014.3001.5482


一、进程的概念

        在学习disable fork语句之前,首先的了解SystemVerilog中的进程概念:进程是一系列可以独立执行的一个或多个表达式。

        SystemVerilog中每个initial语句、always语句(包括always、always_comb、always_latch和always_ff)、final语句和连续赋值语句都定义了一个独立的静态进程,它们的存在由静态层次结构决定,并从仿真开始时开始,并且它们无法在运行时创建。

        除此之外SystemVerilog还有动态进程,这些进程可以在运行时创建、停止、重新启动和销毁。

二、子进程的概念

        上一小节中定义了进程的概念并说明了创建进程的语句有哪些,但是这些进程是独立且不可嵌套的,也就是说所有的initial语句、always语句、final语句和连续赋值语句在一个模块中都是并列的顶层进程。

        fork语句(包括fork-join、fork-join_any、fork-join_none)可以动态创建子进程,其中每条并行的语句都是独立的子进程,当执行到fork语句时子进程创建。

        关于这三种fork语句的区别,请参考下面的博客。

SystemVerilog基础:并行块fork-join、join_any、join_none(上)https://chenzhang.blog.csdn.net/article/details/134694526

三、测试

        在学习了进程和子进程的概念后,下面通过几个例子来巩固知识。

问题1:例1中存在几个顶层进程?

// 例1
module example1;

    // 信号声明
    reg clk, reset;
    reg [7:0] data_in, data_out;
    reg [3:0] address;
    wire [7:0] result;
    
    // 连续赋值语句
    assign result = data_in + data_out;

    // initial 语句
    initial begin
        $display("Simulation started");
        clk = 0;
        reset = 1;
        data_in = 8'h00;
        data_out = 8'h00;
        address = 4'b0000;
        #10 reset = 0;
    end

    // always 语句
    always begin
        #5 clk = ~clk; // 产生时钟信号
    end

    // always_comb 语句
    always_comb begin
        if (reset) begin
            data_out = 8'h00;
        end else begin
            data_out = data_in + 1;
        end
    end

    // always_latch 语句
    always_latch begin
        if (reset) begin
            address = 4'b0000;
        end else begin
            address = address + 1;
        end
    end

    // always_ff 语句
    always_ff @(posedge clk or posedge reset) begin
        if (reset) begin
            data_in <= 8'h00;
        end else begin
            data_in <= data_in + 1;
        end
    end

    // final 语句
    final begin
        $display("Simulation finished");
    end

    // function 定义
    function [7:0] add_two_numbers;
        input [7:0] a, b;
        begin
            add_two_numbers = a + b;
        end
    endfunction

    // task 定义
    task print_address;
        input [3:0] addr;
        begin
            $display("Current address: %b", addr);
        end
    endtask

    // 调用function和task
    initial begin
        #20;
        $display("Sum: %h", add_two_numbers(8'h10, 8'h20));  // 调用function
        print_address(4'b1010);  // 调用task
    end

endmodule

答案1:存在八个顶层进程(需要注意的是,task和function并不属于顶层进程的一种)。

问题2:例2中存在几个子进程?

// 例2
module example2;

    // 信号声明
    reg clk, reset;
    reg [7:0] data_in, data_out;

    // initial 语句
    initial begin // begin-end语句
        $display("Simulation started");
        fork // fork-join 语句
            data_in = 8'hAA;
            begin // begin-end语句
                #10 data_in = 8'hBB;
                #10 data_in = 8'hCC;
            end
        join
        data_out = data_in + 1;
        $display("Data out: %h", data_out);
    end

endmodule

答案2:存在两个子进程,分别是fork-join语句中的data_in = 8'hAA;语句和begin-end语句。其中begin-end语句作为子进程,又由两条阻塞赋值语句组成。顶层进程initial中只有一条begin-end语句,而其中又有四条语句(两条$display语句、一条阻塞赋值语句和一条fork-join语句)。

四、disable fork语句

        disable fork语句终止该语句所在进程创建的所有活跃的子进程,其语法如下所示:

disable fork;

        disable fork语句不仅终止该语句所在进程创建的所有活跃的子进程,还终止子进程的子进程。换句话说,如果任何子进程有自己的子进程,禁用fork语句也将终止它们(这类似disable语句)。

        下面是来自SystemVerilog标准的例子。

task get_first( output int adr );
    fork
        wait_device( 1, adr );
        wait_device( 7, adr );
        wait_device( 13, adr );
    join_any
    disable fork;
endtask

        在任务get_first中,fork-join_any语句创建了三个子进程,每个子进程等待特定设备(1、7、13)就绪并返回其地址。当三个子进程中有任意一个完成时,继续执行父进程中的disable fork语句并终止剩下的两个子进程。

        下面的例3进一步说明了,调用task并不创建子进程。

// 例3
module example3;

    // 信号声明
    reg clk, reset;
    reg [7:0] data_in, data_out;

    task disable_task;
        begin
            disable fork;  
        end
    endtask

    task fork_task;
        begin
            fork
                $display("Task start");
                #10 $display("Task stop"); // 该语句永远不会执行
            join_none
        end
    endtask

    // initial 语句
    initial begin
        fork_task;
        #5 disable_task;
    end

endmodule

        在例3中,只有在执行fork-join_none语句时创建了两个子进程,而其他语句都属于顶层进程initial,因此任务disable_task中的disable fork语句终止了另一个任务中的#10 $display("Task stop");语句,因为该语句在执行disable fork语句时是顶层进程的活跃子进程(子进程$display("Task start");语句此时已经结束了)。

问题3:假设将例3中的initial语句中的begin-end语句换成fork-join语句,如例4所示,此时还能与之前有同样的效果吗?

​// 例4
module example4;

    // 信号声明
    reg clk, reset;
    reg [7:0] data_in, data_out;

    task disable_task;
        begin
            disable fork;  
        end
    endtask

    task fork_task;
        begin
            fork
                $display("Task start");
                #10 $display("Task stop"); // 该语句会执行
            join_none
        end
    endtask

    // initial 语句
    initial fork
        fork_task;
        #5 disable_task;
    join

endmodule

答案4:不行,因为此时disable fork语句所在的进程已经不是任务fork_task中语句的父进程了,事实上disable fork语句所在的进程只有一条disable-fork语句。

五、写在最后

        当disable fork语句终止进程执行时,会有一些其他的副作用,本文将不对此进行详述,具体可参考下面的博客(除其中第三点外)。

Verilog基础:disable语句https://blog.csdn.net/weixin_45791458/article/details/131543670?ops_request_misc=%257B%2522request%255Fid%2522%253A%25220317350431fbd1bf31f233a546d22a2e%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=0317350431fbd1bf31f233a546d22a2e&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-131543670-null-null.nonecase&utm_term=disable&spm=1018.2226.3001.4450

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

富芮坤FR8003硬件:VDDIO供电有工作不正常的情况从VBAT供电正常

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

IBM服务器刀箱Blade安装Hyper-V Server 2019 操作系统

案例:刀箱某一blade,例如 blade 5 安装 Hyper-V Server 2019 操作系统(安装进硬盘) 刀箱USB插入安装系统U盘,登录192.168... IBM BlandeCenter Restart Blande 5,如果Restart 没反应,那就 Power Off Blade 然后再 Power On 重启后进入BIOS界面设置usb存储为开机启动项 …

【大模型】本地部署DeepSeek-R1:8b大模型及搭建Open-WebUI交互页面

本地部署DeepSeek-R1:8b大模型 一、摘要及版本选择说明1.1 摘要1.2 版本选择 二、下载并安装Ollama三、运行DeepSeek-R1:8b大模型四、安装Open WebUI增强交互体验五、关闭Ollama开机自动启动六、DeepSeek大模型启停步骤 一、摘要及版本选择说明 1.1 摘要 作为一名对 AI 和生成…

6、使用one-api管理统一管理大模型,并开始使用本地大模型

文章目录 本节内容介绍集中接入&#xff1a;将大模型统一管理起来当使用了大模型代理大模型代理示例 开源模型&#xff1a;如何使用Hugging Face上的模型modelscope使用 pipeline 调用模型用底层实现调用模型流式输出 如何在项目中使用开源模型使用 LangChain使用集中接入开始使…

绕组电感 - Ansys Maxwell 磁通链与电流

在本博客中&#xff0c;我将演示如何使用 Ansys Maxwell 中磁瞬态求解器的磁通链和电流结果来计算绕组电感。Ansys Maxwell 磁瞬态求解器在场计算中考虑了涡流效应&#xff0c;我将展示一种使用磁通链和电流结果来计算绕组电感的简单方法。 实际上&#xff0c;电感是非线性的…

【图片转换PDF】多个文件夹里图片逐个批量转换成多个pdf软件,子文件夹单独合并转换,子文件夹单独批量转换,基于Py的解决方案

建筑设计公司在项目执行过程中&#xff0c;会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。 操作需求&#xff1a;为了方便内部管理和向客户交付完整的设计方案&#xff0c;公司需要将每个项目文件…

Formality:探针(Probe Point)的设置与使用

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一般情况下&#xff0c;verify命令会对参考设计和实现设计所有匹配的比较点各自进行验证&#xff0c;但有些时候为了调试&#xff0c;可能需要验证参考设计和实现设…

Cherry Studio之DeepSeek联网/本地,建属于自己的AI助理!

上一篇文章&#xff0c;讲了DeepSeek-R1部署到本地的方法。这一篇文章&#xff0c;我们让DeepSeek再一次升级&#xff0c;通过图形化界面来交互&#xff0c;从而变成我们的AI助理&#xff0c;让DeepSeek R1发挥最大实力&#xff01; 首选需要借助硅基流动的API接口&#xff0c…

HarmonyOS Next 方舟字节码文件格式介绍

在开发中&#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中&#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢&#xff1f;我们以一个demo编译出的abc文件&#xff1a; 二进制就是长这样&#xff0c;怎么去理解呢&…

AMD 8845HS 780M核显部署本地deepseek大模型的性能

测试了一下笔记本电脑AMD 8845HS的780M核显是否能本地部署deepseek大模型。 测试软件环境&#xff1a;LM Studio 0.3.9 、Windows 11 24H2 硬件&#xff1a;荣耀X16笔记本 CPU&#xff1a;AMD 8845HS 显卡&#xff1a;780M核显&#xff0c;显存为共享内存自动分配模式&…

实验7 路由器之间IPsec VPN配置

实验7 路由器之间IPsec VPN配置 1.实验目的 通过在两台路由器之间配置IPsec VPN连接&#xff0c;掌握IPsec VPN配置方法&#xff0c;加深对IPsec协议的理解。 2.实验内容 &#xff08;1&#xff09;按照实验拓扑搭建实验环境。 &#xff08;2&#xff09;在路由器R1和R4配置IP…

【FPGA】模型机下载FPGA设计

目录 模型机下载FPGA设计 框架 仿真 代码 MIOC.v IO.v SoC.v 模型机下载FPGA设计 32位MIPS地址空间采用内存与IO统一编址方式&#xff0c;总共232个存储单元&#xff0c;每个单元默认存放1个字节&#xff0c;即总共4GB。划分为:用户空间和内核空间。 &#xff08;1&#xff09;…

【真一键部署脚本】——一键部署deepseek

目录 deepseek一键部署脚本说明 0 必要前提 1 使用方法 1.1 使用默认安装配置 1.1 .1 使用其它ds模型 1.2 使用自定义安装 2 附录&#xff1a;deepseek模型手动下载 3 脚本下载地址 deepseek一键部署脚本说明 0 必要前提 linux环境 python>3.10 1 使用方法 1.1 …

学习笔记:在华为云ModelArts上运行MindSpore扩散模型教程

目录 一、背景与目的 二、环境搭建 三、模型原理学习 1. 类定义与初始化 2. 初始卷积层 3. 时间嵌入模块 4. 下采样模块 5. 中间模块 6. 上采样模块 7. 最终卷积层 8. 前向传播 9. 关键点总结 四、代码实现与运行 五、遇到的问题及解决方法 六、总结与展望 教程来源&#xff1a…

以 Python 为工具搭建的热门旅游景点数据分析系统

系统介绍&#xff1a; 随着计算机技术的飞速发展&#xff0c;计算机系统的应用已广泛渗透到社会的各个领域。大数据的大量应用为人们的生活带来了极大的便利。在此背景下&#xff0c;将热门旅游景点数据分析管理与互联网相结合&#xff0c;利用计算机搭建热门旅游景点数据分析…

如何实现图片式按钮的功能

文章目录 1. 概念介绍2. 使用方法2.1 filled风格2.2 filledTonal风格2.3 outlined风格 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何修改NavigationBar组件的形状"相关的内容&#xff0c;本章回中将介绍IconButtion组件.闲话休提…

华硕笔记本怎么一键恢复出厂系统_华硕笔记本一键恢复出厂系统教程

华硕笔记本怎么一键恢复出厂系统&#xff1f; 华硕一键恢复出厂系统是一个安全、高效、方便的恢复方式&#xff0c;让您轻松还原出厂设置&#xff0c;以获得更好的系统性能。如果您的华硕电脑遇到问题&#xff0c;可以使用华硕一键恢复出厂系统功能。下面小编就教大家华硕笔记本…

腾讯云HAI部署DeepSeek结合Ollama API搭建智能对话系统

前言 本文将详细介绍如何在腾讯云HAI平台上部署DeepSeek模型&#xff0c;并配置使用Ollama API服务以实现对外部请求的支持。通过对前期准备、部署流程、API服务配置及使用的详细阐述&#xff0c;希望能为读者提供一个全面且实用的指南&#xff0c;助力AI应用的高效开发和部署…

从零开始学Python爬虫:(二)使用基本库urllib(上)

urllib库是python内置库&#xff0c;并不需要我们额外安装。 通过它&#xff0c;我们就可以完成请求和响应&#xff0c;得到网页内容。 现在&#xff0c;我们来详细看一看&#xff1a; 一、urllib库构成 而urllib库包含以下四个模块&#xff1a; urllib.request&#xff…

OpenAI Deep Research被huggingface 24小时复现开源了

自OpenAI发布Deep Research&#xff08;一种使用推理来综合大量在线信息并完成多步骤研究任务的AI Agent&#xff09;之后开源社区已经迎来一大波复现了&#xff0c;PaperAgent进行了梳理&#xff1a; 1.2k星 https://github.com/jina-ai/node-DeepResearch 825 https://gith…