是否可以在“生成”内部增加/初始化变量?在verilog中?

发布于 2024-10-31 16:09:49 字数 600 浏览 8 评论 0原文

我对generate有疑问,我的代码是:

parameter m=1;

generate 
 for(i=0; i<m; i=i+1) :loopstart
 begin
  statements;
 end
endgenerate

在这个循环中,m应该是2^0、2^1、2^2等等。自从 不支持求幂,我想到了初始化m然后 每次迭代时将其乘以 2。

我有几个问题:

是否可以使用 m << 1 以某种方式生成(因为这与 乘以 2)?如果我这样做,就会导致错误。

我参考了 Samir Palnitkar 的书,其中说always 语句在生成中有效,所以我尝试:

always @(m)
 m <= m*2; // (or m << 1)

这不起作用。我意识到这是不可能的,因为 m 是一个参数而不是一个变量。

如果我的想法是正确的,那么也不能用 genvar 来完成,因为 genvar 无法初始化。

还有其他选择吗?

I have a doubt in the generate, my code is:

parameter m=1;

generate 
 for(i=0; i<m; i=i+1) :loopstart
 begin
  statements;
 end
endgenerate

Inside this loop, m should be 2^0, 2^1, 2^2, and so on. Since
exponentiation is not supported, I thought of initializing m and then
multiplying it by 2 on each iteration.

I have a few questions:

Is it possible to use m << 1 inside the generate in some way (since this is the same as
multiplying by 2)? If I do that, it results in an error.

I referred to Samir Palnitkar's book, which says that always statement works inside a generate, so I tried:

always @(m)
 m <= m*2; // (or m << 1)

This doesn't work. I realize it can't be done because m is a parameter and not a variable.

If what I think is right, it can't be done with genvar either, since a genvar can't be initialized.

Is there an alternative?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如若梦似彩虹 2024-11-07 16:09:49

这个问题似乎是因为不支持指数而产生的。它们是:

2**0 => 1
2**1 => 2
2**2 => 4

注意:

always @(m)
 m <= m*2; // (or m << 1)

由于某些原因,这是错误的

  1. 不要在组合块中使用 <=
  2. 在上面的表达式中,m 定义了自身并重新触发循环。

我还会避免命名敏感度列表,并使用 always @* 来避免因不完整的敏感度列表而导致硬件模拟不匹配。

参数和本地参数用于定义常量,如果它们不是常量,则使用其他类型,例如逻辑或整数类型。

logic [31:0] m = 0;
logic [31:0] power_two_m;
always @* begin
  power_two_m = 2**m;
  power_two_m = 1 << m;
end

The question seem to have been created because exponentials are not supported. They are :

2**0 => 1
2**1 => 2
2**2 => 4

NB:

always @(m)
 m <= m*2; // (or m << 1)

This is wrong for a few reasons

  1. Do not use <= in combinatorial blocks
  2. In the above expression m defines itself and re-triggers the loop.

I would also avoid named sensitivity lists and use always @* to avoid hardware simulation mismatches from incomplete sensitivity lists.

parameters and localparams are for defining constants, if they are not constant use something else like a logic or integer type.

logic [31:0] m = 0;
logic [31:0] power_two_m;
always @* begin
  power_two_m = 2**m;
  power_two_m = 1 << m;
end
老娘不死你永远是小三 2024-11-07 16:09:49

相反,i++ 使用 i=i+1

并且......忘记 C。

Instead i++ use i=i+1

And.. forget C.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文