如何在Verilog中使用函数?

时间:2017-10-18 15:43:09

标签: function module verilog

在我的FPGA / Verilog课程中,我的教授刚刚完成了功能。

他说在函数中,你可以在程序上编写代码。然后,当你想调用函数时,你可以在一个始终块(即程序)中调用它,或者你可以用assign语句调用它。

如何用程序代码编写函数,然后连续调用函数,对我来说没有意义。

如果有人对此(可能)基本问题有任何见解,我们非常感激。

此致

3 个答案:

答案 0 :(得分:0)

在Verilog或任何其他事件驱动的模拟中没有连续这样的东西。所有行为都是由离散事件驱动的,这意味着信号会改变其值,或者等待离散的时间量。

Verilog中的连续赋值只是定义表达式的一种方式,这样当RHS表达式的任何操作数发生变化时,表达式将被计算并且其结果将传播到LHS目标。任何逻辑或算术表达式都可以包含函数调用。

答案 1 :(得分:0)

返回值(非void函数)的函数在verilog中用作表达式的操作数。它封装了一个verilog表达式,它可以包含函数中的多个语句。因此,它可以在任何可以使用表达的地方使用。程序块和连续分配语句就是这样的地方。

连续分配术语是历史术语,其目的是将值驱动到网络中(如果输入表达式值发生变化,则连续更改网络的值)。因此,如果在rhs中使用函数,它只根据其输入提供值计算。

所以,这是一个例子:

function automatic reg[3:0] sum (reg[3:0] a, reg[3:0] b);
   sum =  a + b;
endfunction // b

reg [3:0] r;
wire [3:0] w;

// use function in the procedural block
always @* 
  r = sum(a, b);

// use function in the continuous assignment
assign w = sum(a,b);

答案 2 :(得分:0)

它与组合逻辑块几乎完全相同。你这样写,但它被合成为完全不同的东西。请考虑以下事项:

always @* begin
    a = b + c;
    d = b + a;
end

always @(posedge clk) begin
    out <= d + in; 
end

这与以下内容完全相同:

function integer calc_d(integer b, integer c) begin
    integer a;
    a = b + c;
    d = b + a;
    calc_d = d; 
end
endfunction

always @(posedge clk) begin
    out <= calc_c(b, c) + in;
end