精华内容
下载资源
问答
  • 了解函数的定义和模块设计使用; 了解函数的可综合性问题; 了解许多综合器不能综合复杂的算术运算。 二、实验原理 与一般的程序设计语言一样,VeirlogHDL也可使用函数以适应对不同变量采取同一运算的...

    一、实验目的

    1. 了解函数的定义和在模块设计中的使用;
    2. 了解函数的可综合性问题;
    3. 了解许多综合器不能综合复杂的算术运算。

     

    二、实验原理

    与一般的程序设计语言一样,Veirlog HDL也可使用函数以适应对不同变量采取同一运算的操作。Veirlog HDL函数在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改变这部分电路的输人以得到相应的计算结果。

           下例是函数调用的一个简单示范。它采用同步时钟触发运算的执行,每个clk时钟周期都会执行一次运算,并且在测试模块中,通过调用系统任务$display及在时钟的下降沿显示每次计算的结果。

    模块源代码:
    //-------------- tryfunct.v --------------
    module tryfunct(clk,n,result,reset);
      output    [31:0]    result;
      input     [3:0]     n;
      input               reset,clk;
      reg       [31:0]    result;
      
      always@(posedge clk)
      begin
        if(!reset)
          result<=0;
        else
          begin
            result<=n*factorial(n)/((n*2)+1);
          end
      end
      
      function  [31:0]  factorial;
        input   [3:0]   operand;
        reg     [3:0]   index;
        begin
          factorial=operand?1:0;
          for(index=2;index<=operand;index=index+1)
            factorial=index*factorial;
        end
      endfunction
      
    endmodule
    
    
    
    测试模块源代码:
    //-------------- tryfunctTop.v  --------------
    `include  "./tryfunct.v"
    `timescale  1ns/100ps
    `define clk_cycle 50
    
    module  tryfunctTop;
      reg   [3:0]   n,i;
      reg           reset,clk;
      
      wire  [31:0]  result;
      
      initial
      begin
        clk=0;
        n=0;
        reset=1;
        #100  reset=0;
        #100  reset=1;
        for(i=0;i<=15;i=i+1)
        begin
          #200  n=i;
        end
        #100 $stop;
      end
      
      always #`clk_cycle clk=~clk;
      
      tryfunct m(.clk(clk),.n(n),.result(result),.reset(reset));
      
    endmodule

     

    三、实验要求及实验内容

    (1)实验内容:

    设计一个带控制端的逻辑运算电路,分别完成正整数的平方、立方和最大数为5的阶乘的运算,要求可综合。编写测试模块,并给出各种层次的仿真波形,比较它们的不同。

    (2)实验代码:

    模块源代码:
    //-------------- logicoperation.v --------------
    module logicoperation(clk,n,result,reset,sl);
      output  [6:0]   result;
      input   [2:0]   n;
      input           reset,clk;
      input   [1:0]   sl;
      reg     [6:0]   result;
    
      always@(posedge clk)
      begin
        if(!reset)
          result<=0;
        else
          begin
            case(sl)
              2'd0: result<=square(n);
              2'd1: result<=cubic(n);
              2'd2: result<=factorial(n);
            endcase
          end
      end
    
      function  [6:0] square;
        input [2:0] operand;
        begin
          square=operand*operand;
        end
      endfunction
    
      function  [6:0] cubic;
        input [2:0] operand;
        begin
          cubic=operand*operand*operand;
        end
      endfunction
    
      function  [6:0] factorial;
        input [2:0] operand;
        reg   [2:0] index;
        begin
          factorial = 1;
          for(index = 2; index <= operand; index =index + 1)
            factorial = index * factorial;
        end
      endfunction
    
    endmodule
    
    
    
    测试模块源代码:
    //-------------- logicoperationTop.v  --------------
    `include    "./logicoperation.v"
    `timescale  1ns/100ps
    `define     clk_cycle 50
    
    module logicoperationTop;
      reg   [2:0] n;
      reg         reset,clk;
      reg   [1:0] sl;
      wire  [6:0] result;
    
      parameter times=20;
    
      initial
      begin
        n=0;
        reset=1;
        clk=0;
        sl=0;
        #100 reset=0;
        #100 reset=1;
        repeat(times)
        begin
          #50 sl={$random}%3;
          #50 n={$random}%6;
        end
        #1000 $stop;
      end
    
      always  #`clk_cycle  clk=~clk;
    
      logicoperation m(.clk(clk),.n(n),.result(result),.reset(reset),.sl(sl));
    
    endmodule
    

     

    四、实验结果

     

    展开全文
  • Verilog中函数

    千次阅读 2009-03-05 21:27:00
    Verilog 函数Verilog HDL与大多数可编程语言一样,将使用率很高的代码,按照软件工程的思想,写成函数,这样,该函数可以被多次调用。Verilog中函数常用语三种情况:1. 数学算术操作 Mathematical Manipulation2...

    Verilog 中的函数

    Verilog HDL与大多数可编程语言一样,将使用率很高的代码,按照软件工程的思想,写成函数,这样,该函数可以被多次调用。

    Verilog中函数常用语三种情况:

    • 1. 数学算术操作 Mathematical Manipulation
    • 2. 组合逻辑 Combinational Logic Sequences
    • 3. 数据的转换 Conversions of Data

     

    Verilog中的函数与C语言中的函数的主要不同之处是:在Verilog中,调用函数时,需要将一个或则多个自变量传给函数;经过0时间的仿真,将函数的结果返回给调用点。

     

    遵循的规则

     

    函数至少要有一个输入量和一个输出量。

    函数只能在always或initial块中调用。

    函数不能同时包含always和initial块,不能含有任何延迟以及时间或事件控制的描述。

    函数可以使用本地变量作为输入。

    函数不能使用wire数据类型。

    函数只能用行为级来描述。

    函数中的数据的实际操作限定在begin和end之间。

     

    原文:http://www.see.ed.ac.uk/~gerard/Teach/Verilog/me5cds/me95cab0.html

     

     

    任务与函数的不同

    任务和函数可以按照相同的方式来调用,但是它们之间有很大的不同。

    函数

    任务

    函数不能调用任务,但是可以调用其他函数。

    任务既可以调用函数,也可以调用其他任务。

    执行函数使用的仿真时间为0。(函数的编译时间不会增加?)

    执行任务的仿真时间为0,但是按照需要,仿真时间可能不为0。

    函数中,不能含有含有延迟,以及事件和时序控制声明语句。

    任务中可以包含任何声明。

    调用函数时,必须至少传递一个变量。

    任务可以使用多个或者不使用变量,其变量的数据端口可以是output 、input或 inout。

    函数只能返回一个值,而且不能使用output和inout描述。

    任务不能返回任何数值,但是可以通过output、inout传递多个值。

     

    原文:http://www.see.ed.ac.uk/~gerard/Teach/Verilog/me5cds/me95cab2.html

     

     

    展开全文
  • verilog函数使用.pdf

    2021-10-09 00:43:28
    verilog函数使用.pdf
  • 函数与任务是仿真中常用的语法,但合理使用也可以设计中使用,可以综合。

    前言

    函数与任务是仿真中常用的语法,但合理使用也可以在设计中使用,可以综合。

    正文

    函数

    很多时候我们会发现某些代码是重复的,在RTL中被多次调用。它们大多不消耗仿真时间,可能涉及复杂的计算,需要用不同的数据值来完成。在这种情况下,我们可以声明一个函数,将重复的代码放在函数里面,让它返回结果。这将大大减少RTL中的行数,因为现在你需要做的就是进行函数调用,并传递需要在其上进行计算的数据。事实上,这与C语言中的函数非常相似。

    函数的目的是返回一个要在表达式中使用的值。一个函数定义总是以关键字function开始,后面是返回类型名称和用括弧括起来的端口列表。当Verilog找到endfunction关键字时,就知道一个函数定义结束了。注意,一个函数至少要声明一个输入,如果函数没有返回任何东西,则返回类型为void

    语法

    function [automatic] [return_type] name ([port_list]);
    	[statements]
    endfunction
    

    关键字automatic将使函数重入,在任务中声明的项目被动态分配,而不是在任务的不同调用之间共享。这对于递归函数,以及当同一个函数在分叉时被N个进程并发执行时,将非常有用。

    函数声明

    有两种方式来声明函数的输入。

    function [7:0] sum;
    	input [7:0] a, b;
    	begin
    		sum = a + b;
    	end
    endfunction
    
    function [7:0] sum (input [7:0] a, b);
    	begin
    		sum = a + b;
    	end
    endfunction
    

    从函数中返回一个值

    函数定义将隐含地创建一个与函数同名的内部变量。因此,在函数的作用域内声明另一个同名的变量是非法的。返回值是通过将函数结果赋值给内部变量来初始化的。

    sum = a + b;
    

    函数调用

    函数调用是一个带有表达式的操作数,其语法如下图所示。

    reg [7:0] result;
    reg [7:0] a, b;
    
    initial begin
    	a = 4;
    	b = 5;
    	#10 result = sum (a, b);
    end
    

    函数规则

    • 函数不能包含任何时间控制的语句,如#, @, wait, posedge, negedge
    • 函数不能调用任务,因为它可能会消耗仿真时间,但可以调用其他函数。
    • 函数应该至少有一个输入
    • 函数不能有非阻塞性的赋值或force…release或assign…deassign。
    • 函数不能有任何触发器
    • 函数不能有output或者inout

    任务

    函数的作用是对输入进行一些处理,并返回一个单一的值,而任务则更为通用,它可以计算出多个结果值,并使用output和inout类型的参数返回。任务可以包含@、posedge等仿真耗时元素。任务有两种写法,我们接下来会看到。

    语法

    
    	// Style 1
    	task [name];
    		input  [port_list];
    		inout  [port_list];
    		output [port_list];
    		begin
    			[statements]
    		end
    	endtask
    
    	// Style 2
    	task [name] (input [port_list], inout [port_list], output [port_list]);
    		begin
    			[statements]
    		end
    	endtask
    
    

    关键字automatic将使任务重入,否则它将默认为静态的。如果一个任务是静态的,那么它的所有成员变量将在同一任务的不同调用中被共享,该任务已被启动为并发运行。注意,auomatic任务项不能通过层次引用来访问。

    任务调用

    如果任务不需要任何参数,那么可以避免使用参数列表。如果任务需要参数,则可以在调用任务时在同一条语句中提供参数。

    
    	task sum (input [7:0] a, b, output [7:0] c);
    		begin
    			c = a + b;
    		end
    	endtask
    // or 	
    	task sum;
    		input  [7:0] a, b;
    		output [7:0] c;
    		begin
    			c = a + b;
    		end
    	endtask
    	
    	
    	initial begin
    		reg [7:0] x, y , z;
    		sum (x, y, z);          
    	end
    
    

    任务使能参数(x,y,z)对应于任务定义的参数(a,b,c)。由于a和b是输入,x和y的值将分别放在a和b中。由于c被声明为输出,并且在调用过程中与z连接,所以总和将自动从c传递到变量z中。

    全局任务

    在所有模块之外声明的任务称为全局任务,因为它们具有全局范围,可以在任何模块中调用。

      
    // This task is outside all modules
    task display();
      $display("Hello World !");
    endtask
    
    module des;
      initial begin
        display();
      end
    endmodule
    

    仿真结果:

    Hello World !
    

    函数与任务之间的区别

    函数任务
    不能有时间控制语句/延迟,因此在同一仿真时间单位内执行。可包含时间控制声明/延迟,且只能在其他时间完成。
    无法启用任务可以实现其他任务和功能
    至少要有一个输入,函数不能有output或者inout。可以有零个或多个任何类型的参数。
    只能返回一个值不能返回一个值,但可以使用输出参数达到同样的效果。

    往期回顾

    Verilog初级教程(17)Verilog中的case语句

    Verilog初级教程(16)Verilog中的控制块

    Verilog初级教程(15)Verilog中的阻塞与非阻塞语句

    Verilog初级教程(14)Verilog中的赋值语句

    Verilog初级教程(13)Verilog中的块语句

    Verilog初级教程(12)Verilog中的generate块

    Verilog初级教程(11)Verilog中的initial块

    Verilog初级教程(10)Verilog的always块

    Verilog初级教程(9)Verilog的运算符

    Verilog初级教程(8)Verilog中的assign语句

    Verilog初级教程(7)Verilog模块例化以及悬空端口的处理

    Verilog初级教程(6)Verilog模块与端口

    Verilog初级教程(5)Verilog中的多维数组和存储器

    Verilog初级教程(4)Verilog中的标量与向量

    Verilog初级教程(3)Verilog 数据类型

    Verilog初级教程(2)Verilog HDL的初级语法

    Verilog初级教程(1)认识 Verilog HDL

    芯片设计抽象层及其设计风格

    Verilog以及VHDL所倡导的的代码准则

    FPGA/ASIC初学者应该学习Verilog还是VHDL?

    参考资料及推荐关注

    Verilog Functions

    Verilog Task

    个人微信公众号: FPGA LAB

    交个朋友

    展开全文
  • Verilog提供一系列系统任务用于记录信号值变化,常见的格式有vcd,fsdb等。 1,Dump VCD格式 $dumpfile("file. dump"); 打开一个VCD数据库用于记录 $dumpvars(level,start_module); 要记录的信号,level=0表示记录...

    Verilog提供一系列系统任务用于记录信号值变化,常见的格式有vcd,fsdb等。
    1,Dump VCD格式

    $dumpfile("file. dump"); 打开一个VCD数据库用于记录
    $dumpvars(level,start_module); 要记录的信号,level=0表示记录所有
    $dumpflush; 将VCD数据保存到磁盘  不明白
    $dumpoff; 停止记录
    $dumpon; 重新开始记录
    $dumplimit(); 限制VCD文件的大小(以字节为单位)
    $dumpall; 记录所有指定的信号值

    用法:

    initial
    begin
    $dumpfile (“verilog. dump”);
    $dumpvars (0, testfixture);
    end

    举例:

    $dumpvars; // Dump所有层次的信号
    $dumpvars (1, top); // Dump top模块中的所有信号
    $dumpvars (2, top. u1); // Dump实例top. u1及其下一层的信号
    $dumpvars (0, top. u2, top. u1. u13. q); // Dump top.u2及其以下所有信号,以及信号top. u1. u13. q。
    $dumpvars (3, top. u2, top. u1); // Dump top. u1和top. u2及其下两层中的所有信号。
    展开全文
  • 前两天工作需要用到verilog的dump函数,一番百度之后发现网上只有一种内容,但是很多人都传播那一份博文,谁是原创也说不清楚,原博文内容也写的模模糊糊,仅仅具有极有限的参考价值。 下面我来结合实际应用,...
  • system verilog中randomize函数(一)

    千次阅读 2020-03-31 17:57:02
    system verilog中经常会对类做随机,但是有时候需要随机之前或者随机之后做一些处理动作.它自带了两个函数方便我们做这些动作,即pre_randomize和post_randomize. 1.执行顺序 随机时,这两个函数是自动执行的...
  • Verilog 的fscanf函数使用

    千次阅读 2019-08-31 19:51:05
    Verilog编写testbench时,系统函数比较常用的一般为display、display、display、fopen、fclose、fclose、fclose、fwrite、$fmonitor。但是关于对于读取文件的数据所采用的fread、fscanf、fgets使用频率相对较少。...
  • Verilog中函数和任务

    千次阅读 2010-07-28 11:25:00
    高级编程语言,为了避免程序多次重复编写特定的例行程序,可以使用子程序和函数Verilog语言也提供类似的功能,即Verilog函数和任务。。它可以把大型程序模块化,从而使代码更加容易理解。。     1...
  • Verilog math 数学函数

    2021-03-12 23:21:46
    Verilog中的数学函数可以用来代替常量表达式,支持整数和实数。 示例 module des #(parameter NUM_UNITS = 7) // Use of this system function helps to reduce the // number of input wires to this module ...
  • Verilog中函数的定义及调用

    千次阅读 2019-08-07 23:54:24
    Verilog中函数的定义及调用。 代码实现: /*----------------------------------- Filename: try_factorial.v Function: Verilog中函数的定义及调用 Author: Zhang Kaizhou Date: 2019-8-7 23:35:17 --------...
  • verilog_平方函数

    2017-05-19 08:53:21
    这个是verilog代码写的平方函数
  • 该库使用python脚本自动生成和流水线逻辑函数组件文件夹可以找到用Verilog编写的预生成的IP内核。 每个组件均已完全流水线化,并且固定数量的时钟周期后可以预期输出值。 每个块的等待时间都可以在Verilog...
  • 1.1 System verilog随机系统函数$urandom使用方法 1.1.1 本节目录 1)本节目录; 2)本节引言; 3)FPGA简介; 4)System verilog随机系统函数$urandom使用方法; 5)结束语。 1.1.2 本节引言 “不积跬步,...
  • 1.1 System verilog随机系统函数$randomize使用方法 1.1.1 本节目录 1)本节目录; 2)本节引言; 3)FPGA简介; 4)System verilog随机系统函数$randomize使用方法; 5)结束语。 1.1.2 本节引言 “不积跬...
  • 1.1 System verilog随机系统函数$random使用方法 1.1.1 本节目录 1)本节目录; 2)本节引言; 3)FPGA简介; 4)System verilog随机系统函数$random使用方法; 5)结束语。 1.1.2 本节引言 “不积跬步,...
  • Verilog中函数实例

    千次阅读 2020-06-30 08:38:58
    给定深度计算位宽 function integer clogb2(input integer depth); begin for(clogb2 = 0;... //此处不减则需要定义reg或者端口的时候减 end endfunction 常规函数格式 // --function to judge.
  • 实际应用当中,我们可能派生扩展类,扩展类当中同样可以定义pre_randomize和post_randomize函数.如果没有调用super.pre_randomize和post_randomize,那么执行时,只会执行扩展类当中的pre和post,否则先执行基类...
  • Verilog HDL打印函数设计,Vivado仿真工程
  • Verilog HDL停止函数设计,Vivado仿真工程
  • Verilog HDL随机函数设计,Vivado仿真工程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,010
精华内容 3,204
关键字:

在verilog中使用函数