首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Verilog变量可以被赋予always块的局部作用域吗?

Verilog变量可以被赋予always块的局部作用域吗?
EN

Stack Overflow用户
提问于 2014-09-16 06:03:34
回答 3查看 23.6K关注 0票数 10

有时,我发现在时钟始终块中对“局部变量”使用阻塞赋值是很有用的。这可以帮助减少重复的代码。

为了避免在不同的always块中意外使用相同的变量(对于模拟来说,这可能是不确定的),我想给它局部作用域。有没有一种很好的可综合的方法来做这件事?

类似于:

代码语言:javascript
复制
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似乎不喜欢它。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-17 00:14:13

我不确定普通Verilog中的语义,但根据SystemVerilog LRM第6.21节:

变量声明应该在过程块中的任何语句之前。

因此,以下是SystemVerilog中的合法语法:

代码语言:javascript
复制
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!

票数 11
EN

Stack Overflow用户

发布于 2014-09-16 06:37:31

尽管有共同的指导原则,但在时钟始终块中使用阻塞赋值是可以的,有时正如您所提到的那样。查看此处:https://stackoverflow.com/a/4774450/1383356

但是,有些工具可能不支持在begin-end块中定义的局部变量。

或者,您可以尝试将always块的部分或全部主体放入一个任务中:

代码语言:javascript
复制
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();
end

Verilog任务可以访问全局变量和局部变量。此外,它们还可以包括非阻塞赋值。

票数 3
EN

Stack Overflow用户

发布于 2014-09-16 09:08:38

标准的可综合方法是对wire使用连续赋值

代码语言:javascript
复制
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
endmodule
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25857630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档