有时,我发现在时钟始终块中对“局部变量”使用阻塞赋值是很有用的。这可以帮助减少重复的代码。
为了避免在不同的always块中意外使用相同的变量(对于模拟来说,这可能是不确定的),我想给它局部作用域。有没有一种很好的可综合的方法来做这件事?
类似于:
module sum3(
input clk,
input [7:0] in1,
input [7:0] in2,
input [7:0] in3,
output reg [7:0] result,
output reg [7:0] result_p1);
begin :sum
reg [7:0] sum_temp; // local variable
always @(posedge clk) begin
sum_temp = in1 + in2 + in3;
result <= sum_temp;
result_p1 <= sum_temp + 1;
end
end
endmodule(ModelSim似乎可以接受这一点,但Synplify似乎不喜欢它。)
发布于 2014-09-17 00:14:13
我不确定普通Verilog中的语义,但根据SystemVerilog LRM第6.21节:
变量声明应该在过程块中的任何语句之前。
因此,以下是SystemVerilog中的合法语法:
module sum3(
input clk,
input [7:0] in1,
input [7:0] in2,
input [7:0] in3,
output reg [7:0] result,
output reg [7:0] result_p1);
always @(posedge clk) begin : sum
reg [7:0] sum_temp; // local variable (scope limited to process)
sum_temp = in1 + in2 + in3;
result <= sum_temp;
result_p1 <= sum_temp + 1;
end
endmodule注意,我已经将变量声明sum_temp移到了进程中,从而限制了作用域并消除了对命名sum块的需要。这是在Modelsim和Riviera上编译的(EDA Playground上的例子)。
如果你的工具不支持这个语法,那就抛出一个bug!
发布于 2014-09-16 06:37:31
尽管有共同的指导原则,但在时钟始终块中使用阻塞赋值是可以的,有时正如您所提到的那样。查看此处:https://stackoverflow.com/a/4774450/1383356
但是,有些工具可能不支持在begin-end块中定义的局部变量。
或者,您可以尝试将always块的部分或全部主体放入一个任务中:
task SUM_TASK();
reg [7:0] sum_temp; // local variable
sum_temp = in1 + in2 + in3;
result <= sum_temp;
result_p1 <= sum_temp + 1;
endtask
always @(posedge clk) begin
SUM_TASK();
endVerilog任务可以访问全局变量和局部变量。此外,它们还可以包括非阻塞赋值。
发布于 2014-09-16 09:08:38
标准的可综合方法是对wire使用连续赋值
module sum3(
input clk,
input [7:0] in1,
input [7:0] in2,
input [7:0] in3,
output reg [7:0] result,
output reg [7:0] result_p1);
wire [7:0] sum_temp = in1 + in2 + in3;
always @(posedge clk) begin
result <= sum_temp;
result_p1 <= sum_temp + 1;
end
endmodulehttps://stackoverflow.com/questions/25857630
复制相似问题