简体   繁体   English

在可综合的Verilog中,我们可以在generate块中使用Assign语句吗?

[英]In synthesizable verilog, can we use assign statement in generate block?

For example, I have the below piece of code. 例如,我有下面的代码。 Can we assign wire inside the generate block in synthesizable verilog? 我们可以在可合成Verilog中在generate块内分配导线吗? Can we use assign statement inside the generate block in synthesizable verilog? 我们可以在可合成的Verilog中的generate块内使用Assign语句吗?

genvar i;
generate
        for (i = 0; i < W; i=i+1) begin:m
                wire [2:0] L;
                assign L[1:0] = { a[i], b[i] };
        end
endgenerate

Yes. 是。 It is possible. 有可能的。 A generate statement is just a code generator directive to the synthesizer. generate语句只是合成器的代码生成器指令。 Basically, it is just loop unrolling. 基本上,它只是循环展开。 This is if the loop can be statically elaborated. 这是可以静态地构造循环的情况。 That is, the number of times the loop is to executed should be determinable at compile time. 也就是说,循环的执行次数应在编译时确定。

genvar i;        
generate        
for (i = 0; i < 2 ; i++) {        
  assign x[i] = i;}        
endgenerate 

unrolls into         
assign x[0] = 0;        
assign x[1] = 1;

In synthesizeable Verilog, it is possible to use an assign statement inside of a generate block. 在可综合的Verilog中,可以在generate块内部使用一个assign语句。 All a generate block does is mimic multiple instants. 生成块所做的只是模仿多个瞬间。 Be careful though, because just like a for loop, it could be very big space-wise. 但是要小心,因为就像for循环一样,它在空间上可能非常大。

You can use assign in generate statment, it is quite common to help parameterise the hook up modules 您可以在生成语句中使用assign,这很常见,可以帮助参数化连接模块

The original code has some issues: L is defined multiple times and it is only assigned 2 out of 3 bits 原始代码存在一些问题: L被多次定义,并且仅被分配3位中的2位

genvar i;
generate
  for (i = 0; i < W; i=i+1) begin:m
    wire [2:0] L;
    assign L[1:0] = { a[i], b[i] };
  end
endgenerate

Could be changed to: 可以更改为:

localparam   W = 4;
reg  [W-1:0] a;
reg  [W-1:0] b;
wire   [1:0] L [0:W-1];

genvar i;
generate
  for (i = 0; i < W; i=i+1) begin:m
    assign L[i] = { a[i], b[i] };
  end
endgenerate

Here L[i] selects the i'th wire [1:0] part of L. While a[i] and b[i] are bit selects. L[i]在这里选择L[i]的第i wire [1:0] 。a a[i]b[i]是位选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我们可以在Always块中使用三元运算符吗? MOD(%)运算符可以合成吗? - Can we use ternary operator inside an always block? Is MOD(%) operator synthesizable? 将可综合的初始值分配给 Verilog 中的 reg - Assign a synthesizable initial value to a reg in Verilog 禁用命名块操作的Verilog代码是否可以合成? - Is Verilog code with disable named block operation synthesizable? Verilog disable语句不起作用,但$ finish起作用,但是不能合成? - Verilog disable Statement not Working but $finish works but it is not synthesizable? 在case语句系统verilog中生成块 - Generate block inside case statement system verilog Verilog生成带有always @(*)块的语句 - Verilog generate statement with always@(*) block 在verilog或系统verilog中生成块内部case语句 - Generate block inside case statement in verilog or system verilog 为什么我们在Verilog / Systemverilog中使用Always Block设计的Combinatorial Circuits中使用Blocking语句?为什么不Nonblocking? - Why do we use Blocking statement in Combinatorial Circuits designed using Always Block in Verilog/Systemverilog ? Why not Nonblocking? Verilog - 是否可以根据生成块中的genvar变量为寄存器赋值 - Verilog - Is it possible to assign values to a register based on the genvar variables in a generate block 如何在Verilog生成块中表示赋值逻辑数组? - How to represent assign logic array in Verilog generate block?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM