我刚刚发现,当涉及function时,总是@(*)不像预期的那样工作。
请参阅下面的简单示例代码。
http://www.edaplayground.com/x/J7M
module test;
reg a, b, c;
function reg my_func();
if (b==0) begin
$display("DEBUG 0 @%0t", $time);
return a;
end
else if (b==1) begin
$display("DEBUG 1 @%0t", $time);
return ~a;
end
else begin
$display("DEBUG 2 @%0t", $time);
return 0;
end
endfunction
always @(*) begin
//always_comb begin
c = my_func();
end
initial begin
a = 0; #10;
a = 1; #10;
a=0;
end
endmodule在仿真中尝试在always @(*)和always_comb之间切换。如果我使用always @(*),什么都不会显示。但是,如果我使用always_comb,它将显示预期的结果如下:
DEBUG 2 @0
DEBUG 2 @0
DEBUG 2 @10
DEBUG 2 @20上面的代码只是简单的组合逻辑。为什么always @(*)和always_comb显示不同的结果?这仅仅是模拟问题吗?在进一步的实验中,我注意到这可能与始终块中function的使用有关。
发布于 2015-09-25 10:41:08
始终@(*)块对所有变量的值变化都很敏感,这些变量是由始终块读取的,或者可以说是位于始终块内部右侧的变量。
在您的示例中,始终块中没有使用任何变量,所以这个始终是@(*)的块在这里不能工作。
根据SV LRM,
always_comb对函数内容中的更改非常敏感,而@*始终只对函数的参数更改敏感。
也就是说,每当函数中的变量发生变化时,always_comb就会触发,但在您的情况下,只有在函数中传递参数时,始终@(*)才会触发。
所以要么你可以用,
always @(*) begin
c = my_func(b);
end或者你可以用,
always_comb begin
c = my_func();
end我修改了你的密码。请在以下链接中找到它。
http://www.edaplayground.com/x/JiS
发布于 2015-09-25 15:30:42
always @(*)由Verilog 1364-2001标准添加,在SystemVerilog IEEE1800-2005标准中被always_comb所取代。不应该再使用always @(*),因为它不能在所有情况下正确地模拟硬件。除了函数的不同之外,它不能正确地处理常量逻辑。
parameter C = 0;
reg A,B;
always @(*) A = B && C;在对A进行更改之前,B仍然是未知的。而使用always_comb将立即将A设置为0,因为在时间0处的执行是有保证的。
https://stackoverflow.com/questions/32778798
复制相似问题