• 关于verilog的时延研究


    时延赋值

    疑问: 网页Verilog时延一章,有关assign #20 so_lose = ai & bi到底是先延时20个时间单位再采样还是先采样再时延20个时间单位。做了以下的实验

    1、原代码

    1. time_delay_module模型
    module time_delay_module(
        input   ai, bi,
        output  so_lose, so_get, so_normal);
     
        assign #20      so_lose      = ai & bi ;
        assign  #5      so_get       = ai & bi ;
        assign          so_normal    = ai & bi ;
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. testbench
    `timescale 1ns/1ns
    
    module test ;
        reg  ai, bi ;
        wire so_lose, so_get, so_normal ;
     
        initial begin
            ai        = 0 ;
            #25 ;      ai        = 1 ;
            #35 ;      ai        = 0 ;        //60ns
            #40 ;      ai        = 1 ;        //100ns
            #10 ;      ai        = 0 ;        //110ns
        end
     
        initial begin
            bi        = 1 ;
            #70 ;      bi        = 0 ;
            #20 ;      bi        = 1 ;
        end
     
        time_delay_module  u_wire_delay(
            .ai              (ai),
            .bi              (bi),
            .so_lose         (so_lose),
            .so_get          (so_get),
            .so_normal       (so_normal));
     
        initial begin
            forever begin
                #100;
                //$display("---gyc---%d", $time);
                if ($time >= 1000) begin
                    $finish ;
                end
            end
        end
     
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    把这个的代码的波形加载后观看
    在这里插入图片描述
    由于延后时的ai和bi的电平值相同,因此无法判断是先采样后延时赋值还是先延时后采样赋值,因此需要对原代码进行修改。

    2、修改

    将test模型的第一个initial的时间稍做修改,其余的保持不变,结果如下,即把第一个25个时间单位的时延改成3

     initial begin
         ai              = 0;
         #3           ai = 1;
         #35          ai = 0;
         #40          ai = 1;
         #10          ai = 0;
     end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    下载波形查看
    在这里插入图片描述
    由波形可以看出

    1. so_normal是没有时延的直接赋值,因此为ai&bi,结果为低电平。
    2. so_lose和so_get分别时延20和5个时间单位,但是刚开始的ai低平时钟只有3个单位,因此被忽略了,当ai到第3个时间单位时才重新计时。此时还是无法分清楚到底先采样后延时赋值还是先延时后采样赋值。

    3.再修改

    代码继续做如下改动,即将刚刚修改的3个延时的时间单位改成5

     initial begin
         ai              = 0;
         #5           ai = 1;
         #35          ai = 0;
         #40          ai = 1;
         #10          ai = 0;
     end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    再拉取波形如下
    在这里插入图片描述

    1. 这次so_get在5个单位前后拥有不同的电平值,可以很清楚的看到:ai的第5个单位是高电平而开始是低电平,so_get第5个单位是低电平,因此是先执行ai&bi为低电平,然后时延5个单位再赋值给so_get
    2. 因此结论正如原文中所说先采样,后延时赋值.
  • 相关阅读:
    死锁
    找链表的交点
    c++/win32实现模拟windows鼠标键盘操作
    Flink---5、聚合算子、用户自定义函数、物理分区算子、分流、合流
    《Effective STL》读书笔记(三):关联容器
    5-1RT-Thread互斥量
    UIStackView嵌套的Label多行文字动态高度
    NTFS文件系统.权限
    携职教育:来说说中级经济师的利与弊
    typescript-补充内容(十一)
  • 原文地址:https://blog.csdn.net/wzj_sxpi/article/details/126024028