ASIC-WORLD Verilog(7)过程语句

这篇具有很好参考价值的文章主要介绍了ASIC-WORLD Verilog(7)过程语句。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

        在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。

        这是网站原文:Verilog Tutorial

        这是系列导航:Verilog教程系列文章导航

Verilog的抽象层级

  • 行为模型(Behavioral Models):对逻辑行为进行建模的更高级别的建模
  • RTL 模型(RTL Models):逻辑在寄存器级建模
  • 结构模型(Structural Models):逻辑在寄存器级和门级都被建模

过程块(Procedural Blocks)

        Verilog行为代码在过程块内部,但有一个例外:一些行为代码也存在于过程块之外。随着文章的深入,我们可以详细了解这一点。

        Verilog 中有两种类型的过程块:         

  • initial initial 仅在时间零执行一次(从时间零开始执行)
  • always : always 循环一遍又一遍地执行;顾名思义,它总是在执行

initial 的使用示例

module initial_example();
reg clk,reset,enable,data;

initial begin
 clk = 0;
 reset = 0;
 enable = 0;
 data = 0;
end

endmodule

        在上面的示例中,initial的执行从时间 0 开始。initial中的语句执行一次后就不会再次被执行了。

always 的使用示例

module always_example();
reg clk,reset,enable,q_in,data;

always @ (posedge clk)
if (reset)  begin
   data <= 0;
end else if (enable) begin   
   data <= q_in;
end

endmodule

        在always中,当触发事件发生时,就会执行begin和end里面的代码;然后再次等待下一个事件触发。重复这个等待和执行事件的过程,直到仿真停止。

过程赋值语句

  • 过程赋值语句可以将值赋给 reg、interger、real和time变量,但不能将值赋给net(wire数据类型)
  • 您可以将net(wire)、常量、另一个寄存器或某个特定值赋值给寄存器(reg 数据类型)

       

        下面的代码是错误的:在initial中对wire变量进行了赋值。

module initial_bad();
reg clk,reset;
wire enable,data;

initial begin
 clk = 0;
 reset = 0;
 enable = 0;
 data = 0;
end

endmodule

        下面的代码是正确的:在initial中仅对reg变量进行了赋值。

module initial_good();
reg clk,reset,enable,data;

initial begin
 clk = 0;
 reset = 0;
 enable = 0;
 data = 0;
end

endmodule

        如果需要同时实现多个过程赋值语句,则这些语句必须包含在:

  • 顺序的 begin-end 块中
  • 并行的 fork-join 块中

begin-end语句的示例

        begin-end是顺序执行的,所以赋值语句会按照时间顺序一条一条地执行----在时间1对clk赋值,在时间1+10对reset赋值,在时间1+10+5对enable赋值,等等······

module initial_begin_end();
reg clk,reset,enable,data;

initial begin
 $monitor(
   "%g clk=%b reset=%b enable=%b data=%b", 
   $time, clk, reset, enable, data);
 #1  clk = 0;
 #10 reset = 0;
 #5  enable = 0;
 #3  data = 0;
 #1 $finish;
end

endmodule

        这个代码的仿真结果是这样的:

0  clk=x reset=x  enable=x  data=x
1  clk=0 reset=x  enable=x  data=x
11 clk=0 reset=0 enable=x  data=x
16 clk=0 reset=0 enable=0  data=x
19 clk=0 reset=0 enable=0  data=0

fork-join语句的示例

        fork-join是顺序执行的,所以赋值语句会同时执行----在时间1对clk赋值,在时间10对reset赋值,在时间5对enable赋值,等等······

module initial_fork_join();
reg clk,reset,enable,data;

initial begin
 $monitor("%g clk=%b reset=%b enable=%b data=%b", 
   $time, clk, reset, enable, data);
 fork
   #1  clk = 0;
   #10 reset = 0;
   #5  enable = 0;
   #3  data = 0;
 join
 #1 $display ("%g Terminating simulation", $time);
 $finish;
end

endmodule

        这个代码的仿真结果是这样的:

0 clk=x reset=x enable=x data=x
1 clk=0 reset=x enable=x data=x
3 clk=0 reset=x enable=x data=0
5 clk=0 reset=x enable=0 data=0
10 clk=0 reset=0 enable=0 data=0
11 Terminating simulation

阻塞赋值与非阻塞赋值(Blocking and Nonblocking assignment)

        阻塞赋值按照顺序执行,它们会阻塞下一条语句的执行,直到执行完当前语句,因此被称为阻塞赋值。使用符号“=”进行赋值,示例:a = b;

        非阻塞赋值是并行执行的,下一条语句的执行不会因为当前语句的执行而阻塞,因此它们被称为非阻塞语句。使用符号“<=”符号进行赋值,示例:a <= b;

        来看个例子:

module blocking_nonblocking();

reg a,b,c,d;
// Blocking Assignment
initial begin
  #10 a = 0;
  #11 a = 1;
  #12 a = 0;
  #13 a = 1;
end

initial begin
  #10 b <= 0;
  #11 b <= 1;
  #12 b <= 0;
  #13 b <= 1;
end

initial begin
   c = #10 0;
   c = #11 1;
   c = #12 0;
   c = #13 1;
end

initial begin
   d <= #10 0;
   d <= #11 1;
   d <= #12 0;
   d <= #13 1;
end

initial begin
  $monitor("TIME = %g a = %b b = %b c = %b d = %b",$time, a, b, c, d);
  #50 $finish;
end

endmodule

        这是仿真结果和仿真波形:

TIME = 0   a = x b = x c = x  d = x
TIME = 10 a = 0 b = 0 c = 0 d = 0
TIME = 11 a = 0 b = 0 c = 0 d = 1
TIME = 12 a = 0 b = 0 c = 0 d = 0
TIME = 13 a = 0 b = 0 c = 0 d = 1
TIME = 21 a = 1 b = 1 c = 1 d = 1
TIME = 33 a = 0 b = 0 c = 0 d = 1
TIME = 46 a = 1 b = 1 c = 1 d = 1

ASIC-WORLD Verilog(7)过程语句文章来源地址https://www.toymoban.com/news/detail-433067.html

到了这里,关于ASIC-WORLD Verilog(7)过程语句的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ASIC-WORLD Verilog(3)第一个Verilog代码

            在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的Verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:Verilog Tutorial         这是系列导航:Verilo

    2023年04月16日
    浏览(28)
  • ASIC-WORLD Verilog(4)基础语法上篇

            在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:http://asic-world.com/verilog/veritut.html         这

    2023年04月10日
    浏览(28)
  • ASIC-WORLD Verilog(5)基础语法下篇

            在自己准备写一些简单的verilog教程之前,参考了许多资料----asic-world网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:http://asic-world.com/verilog/veritut.html       

    2023年04月17日
    浏览(27)
  • ASIC-WORLD Verilog(10)编写测试脚本Testbench的艺术

            在自己准备写一些简单的verilog教程之前,参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。         这是网站原文:Verilog Tutorial         这是系列导航:

    2024年02月07日
    浏览(28)
  • PaddleOCR训练自己模型(1)----数据准备

    PaddleOCR开源代码(下载的是2.6RC版本的,可以根据自己需求下载) 具体环境安装就不详细介绍了, 挺简单的,也挺多教程的。 二、数据集准备及制作 (1)下载完代码及配置完环境之后,运行PPOCRLabel.py文件,打开标注软件( 2.7版本的会运行报错,解决方案如下 )解决PPOCR

    2024年04月16日
    浏览(37)
  • 【MySQL 】:测试数据准备、SQL语句规范与基本操作

    欢迎来到小K的MySQL专栏,本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解 要学习SQL查询语句,首先必须解决一个问题,数据问题。为了方便大家学习阅读我的文章,在这里提供了一个test.sql文件 ✨ 登录MySQL,输入 source xxx/test.sql 导入sql文

    2024年02月10日
    浏览(35)
  • 【②MySQL 】:测试数据准备、SQL语句规范与基本操作

    欢迎来到小K的MySQL专栏,本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解 要学习SQL查询语句,首先必须解决一个问题,数据问题。为了方便大家学习阅读我的文章,在这里提供了一个test.sql文件 ✨ 登录MySQL,输入 source xxx/test.sql 导入sql文

    2024年02月10日
    浏览(38)
  • Verilog中的 条件语句\多路分支语句\循环语句

    一、背景 由于初学Verilog,故写篇笔记记录Verilog中的 if-else 、 case-endcase 、 for 、 while 、 repeat 、 forever 语法,以及例子。 二、if-else 定个标准,每个 if-else 的出现都要有 begin-end 语句。 2.1 标准结构 条件语句标准使用结构: 2.2 例子 二输入选择器: 三、case-endcase case 语句是一

    2024年02月11日
    浏览(37)
  • Verilog中if 语句与wait语句的区别

    (1) if语句是非阻塞语句 ,在initial语句中遇到 if 语句时,会判断条件是否成立,如果if条件成立,将会执行if条件成立后的语句;如果if 语句不成立,那么if后面的语句将会跳过而不执行。不会阻塞后面语句的执行,所以它是非阻塞语句。 (2) wait语句是阻塞语句 ,遇到

    2024年02月14日
    浏览(24)
  • Verilog Tutorial(7)If语句和Case语句

    在自己准备写verilog教程之前,参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错,只是没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。 这是网站原文:https://fpgatutorial.com/verilog/ 这是系列导航:Verilog教程系列文章导航 这篇文

    2023年04月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包