vivado对task和function的可综合支持

手册UG901,对vivado可综合的语句支持进行了描述,HDL包括:verilog-2001,system-verilog,VHDL;

verilog-2001扩展了对task和function的支持。

ug901手册中,章节7对支持的语法进行详细描述。

 1 Filename: functions_1.v
 2 //
 3 // An example of a function in Verilog
 4 //
 5 // File: functions_1.v
 6 //
 7 module functions_1 (A, B, CIN, S, COUT);
 8   input [3:0] A, B;
 9   input CIN;
10   output [3:0] S;
11   output COUT;
12   wire [1:0] S0, S1, S2, S3;
13      function signed [1:0] ADD;
14       input A, B, CIN;
15       reg S, COUT;
16       begin
17           S    = A ^ B ^ CIN;
18           COUT = (A&B) | (A&CIN) | (B&CIN);
19           ADD  = {COUT, S};
20       end
21     endfunction
22
23 assign S0 = ADD (A[0], B[0], CIN),
24        S1 = ADD (A[1], B[1], S0[1]),
25        S2 = ADD (A[2], B[2], S1[1]),
26        S3 = ADD (A[3], B[3], S2[1]),
27        S  = {S3[0], S2[0], S1[0], S0[0]},
28        COUT = S3[1];
29 endmodule

 1 Filename: task_1.v
 2 // Verilog tasks
 3 // tasks_1.v
 4 //
 5 module tasks_1 (A, B, CIN, S, COUT);
 6    input [3:0] A, B;
 7    input CIN;
 8    output [3:0] S;
 9    output COUT;
10    reg [3:0] S;
11    reg COUT;
12    reg [1:0] S0, S1, S2, S3;
13
14   task ADD;
15       input A, B, CIN;
16       output [1:0] C;
17       reg [1:0] C;
18       reg S, COUT;
19         begin
20            S    = A ^ B ^ CIN;
21            COUT = (A&B) | (A&CIN) | (B&CIN);
22            C    = {COUT, S};
23         end
24   endtask
25
26 always @(A or B or CIN)
27    begin
28        ADD (A[0], B[0], CIN, S0);
29        ADD (A[1], B[1], S0[1], S1);
30        ADD (A[2], B[2], S1[1], S2);
31        ADD (A[3], B[3], S2[1], S3);
32        S    = {S3[0], S2[0], S1[0], S0[0]};
33        COUT = S3[1];
34    end
35
36 endmodule

 1 Filename: asym_ram_tdp_read_first.v
 2 // Asymetric RAM - TDP
 3 // READ_FIRST MODE.
 4 // asym_ram_tdp_read_first.v
 5
 6 module asym_ram_tdp_read_first
 7         (clkA, clkB, enaA, weA, enaB, weB, addrA, addrB, diA, doA, diB, doB);
 8
 9 parameter WIDTHB     = 4;
10 parameter SIZEB      = 1024;
11 parameter ADDRWIDTHB = 10;
12 parameter WIDTHA     = 16;
13 parameter SIZEA      = 256;
14 parameter ADDRWIDTHA = 8;
15
16    input                  clkA;
17    input                  clkB;
18    input                  weA, weB;
19    input                  enaA, enaB;
20    input [ADDRWIDTHA-1:0] addrA;
21    input [ADDRWIDTHB-1:0] addrB;
22    input [WIDTHA-1:0]     diA;
23    input [WIDTHB-1:0]     diB;
24    output [WIDTHA-1:0]     doA;
25    output [WIDTHB-1:0]     doB;
26
27 `define max(a,b) {(a) > (b) ? (a) : (b)}
28 `define min(a,b) {(a) < (b) ? (a) : (b)}
29
30 function integer log2;
31   input integer value;
32   reg [31:0] shifted;
33   integer res;
34      begin
35         if (value < 2)
36            log2 = value;
37         else
38            begin
39               shifted = value-1;
40               for (res=0; shifted>0; res=res+1)
41                  shifted = shifted>>1;
42                  log2    = res;
43            end
44      end
45 endfunction
46
47
48
49 localparam maxSIZE = `max(SIZEA, SIZEB);
50 localparam maxWIDTH = `max(WIDTHA, WIDTHB);
51 localparam minWIDTH = `min(WIDTHA, WIDTHB);
52 localparam RATIO = maxWIDTH / minWIDTH;
53 localparam log2RATIO = log2(RATIO);
54 reg [minWIDTH-1:0] RAM [0:maxSIZE-1];
55 reg [WIDTHA-1:0] readA;
56 reg [WIDTHB-1:0] readB;
57
58   always @(posedge clkB)
59     begin
60       if (enaB) begin
61         readB <= RAM[addrB] ;
62         if (weB)
63           RAM[addrB] <= diB;
64         end
65     end
66
67 always @(posedge clkA)
68    begin : portA
69         integer i;
70         reg [log2RATIO-1:0] lsbaddr ;
71         for (i=0; i< RATIO; i= i+ 1) begin
72            lsbaddr = i;
73            if (enaA) begin
74                  readA[(i+1)*minWIDTH -1 -: minWIDTH] <= RAM[{addrA, lsbaddr}];
75                if (weA)
76                  RAM[{addrA, lsbaddr}] <= diA[(i+1)*minWIDTH-1 -: minWIDTH];
77            end
78         end
79    end
80
81 assign doA = readA;
82 assign doB = readB;
83 endmodule

veriilog对常量、结构和编译指令的支持:

Verilog constant  
force Unsupported
release Unsupported
forever statements Unsupported
repeat statements Supported, but repeat value must be
constant
for statements Supported, but bounds must be static
delay (#) Ignored
event (@) Unsupported
wait Unsupported
named events Unsupported
parallel blocks Unsupported
specify blocks Ignored
disable Supported except in For and Repeat
Loop statements
Verilog Design Hierarchies
module definition Supported
macromodule definition Unsupported
hierarchical names Supported
defparam Supported
array of instances Supported
Verilog Compiler Directives
`celldefine `endcelldefine Ignored
`default_nettype Supported
`define Supported
`ifdef `else `endif Supported
`undef, `ifndef, `elsif Supported
`include Supported
`resetall Ignored
`timescale Ignored
`unconnected_drive
`nounconnected_drive
Ignored
`uselib Unsupported
`file, `line Supported

 

原文地址:https://www.cnblogs.com/limanjihe/p/9780797.html

时间: 2024-08-28 09:54:56

vivado对task和function的可综合支持的相关文章

Verilog HDL中task与function的区别

任务.函数的定义和调用都包括在一个module的内部,他们一般用于行为级建模,在编写Testbench时用的较多,而在写可综合的代码时要少用. function的定义: function<返回值类型和位宽> <函数名> <入口参量和类型声明> <局部变量声明> 行为语句: endfunction 定义function时,要注意以下几点: (1):  function定义结构不能出现在任意一个过程块(always块或者initial块)的内部: (2):  f

SV中的task和function

SV中的Task和Function不需要,必须加一个begin..end来指明body. task    muliple_line; ......body... endtask :multiple_line 子程序在执行到子程序的最后一行就返回,将返回值赋给与函数同名的变量,也可以显式的调用return来返回. SV中module和program的子程序默认是静态存储的,当需要动态存储时,仍然需要显式的用automatic显式指出.(class中默认是automatic的) 子程序中的参数缺省值

RTL基本知识:task和function

在使用Verilog进行设计的过程中,使用task和function在同一个module中多次调用,充分提高了代码的复用性,有效增强设计的可维护性和复用性,可以避免不同模块间代码复制导致的不必要的错误.本文主要探讨task和function的使用以及两者之间的异同点. 1    task 定义不能出现在过程性语句快中,但是必须在"module-end"结构中. 格式一: 格式二: task可以没有或者有一个或多个参数,值通过参数传入和传出task.输入输出在任务开始处声明,且输入与输出

(原创)task和function语法的使用讨论(Verilog,CPLD/FPGA)

1. Abstract   function和task语句的功能有很多的相似之处,在需要有多个相同的电路生成时,可以考虑使用它们来实现.因为个人使用它们比较少,所以对它们没有进行更深的了解,现在时间比较充裕,我想通过写几个简单的电路将它们二者的功能进行验证一下,看看究竟是怎么生成电路的. 2. Contents     主要为测试function和task各自生成的电路,所以电路设计功能比较简单--4位BCD码转换成4位余3码.     文件开头的注释说明. /* ---------------

Verilog HDL常用综合语法

前面已经记录了一些组成Verilog的基本组成,可以用这些基本组成来构成表达式.这一节,就来记录一下把这些表达式构成一个文件的各种行为描述语句. ①这里用Verilog基本要素进行的行为描述主要是针对综合来的,也就是可以设计出实际电路来的(行为描述语句有两大子集,一个是面向综合,一个是面向仿真).②行为描述语句一般指放在always语句中.内容提纲如下所示: ·触发事件控制 ·条件语句(if与case语句) ·循环语句 ·任务和函数 ·编译预处理 一.触发事件控制 ①电平敏感事件是指 指定信号的

grunt入门讲解4:如何创建task(任务)

每当运行Grunt时, 你可以为其指定一个或多个任务, 这些任务用于告诉Grunt你想要它做什么事情. 如果你没有指定一个任务,并且你已经定义一个名为 "default" 的任务,那么该任务将会默认被执行. 任务别名 如果指定了一个任务列表taskList,新任务名taskName将是这一个或多个指定任务的别名.当运行此 "任务别名" 时,在taskList 中指定的每个任务都会按照其出现的顺序依次执行.taskList参数必须是一个任务数组.grunt.regis

一步一步实现基于Task的Promise库(五)waitFor和waitForAny的实现

在实现waitFor方法之前,我们先要搞明白下面这些问题: 1. waitFor方法的形参有限制吗? 没有!如果形参是Task类型,不应该启动Task,如果是function类型,会执行方法.所以waitFor的使用场景应该是waitFor(task1,task2),并且task1,2不知道何时启动(比如是用户点击界面按钮来启动) 2. 关于参数的传递. 1 var taskExp_0 = new Task(readFile, "123.txt"); 2 var taskExp_1 =

实践基于Task的异步模式

Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueWith的方法实现的.基于语言的异步支持通过允许在正常控制流内部等待异步操作隐藏callbacks,具有和编译器生成的代码相同的API级别的支持. 在.Net 4.5,C#直接异步地支持等待的Task和Task<TResult>,在C#中使用"await"关键字.如果等待一个Ta

gulp入坑系列(3)——创建多个gulp.task

继续gulp的爬坑路,在准备get更多gulp的具体操作之前,先来明确一下在gulp中创建和使用多个task任务的情况. gulp所要做的操作都写在gulp.task()中,系统有一个默认的default任务,如下: var gulp = require('gulp');//gulp自身 gulp.task('default',['task1','task2'], function() { // 将你的默认的任务代码放在这 console.log("default"); }); 在命令