在我的FPGA / Verilog课程中,我的教授刚刚完成了功能。
他说在函数中,你可以在程序上编写代码。然后,当你想调用函数时,你可以在一个始终块(即程序)中调用它,或者你可以用assign语句调用它。
如何用程序代码编写函数,然后连续调用函数,对我来说没有意义。
如果有人对此(可能)基本问题有任何见解,我们非常感激。
此致
答案 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