【问题标题】:Non-constant indexing for a logic statement in systemverilogsystemverilog中逻辑语句的非常量索引
【发布时间】:2015-11-23 06:01:16
【问题描述】:

我正在尝试创建一个 for 循环,在给定循环迭代的情况下为逻辑数组分配不同的值。

因此,例如,假设我正在尝试实例化两个不同的砖块,宽度均为 10,高度为 5。假设这些值中的每一个都是 10 位。对于两块砖,我有代码:

logic[19:0] Brick_Width;
logic[19:0] Brick_Height;

第一个砖块的宽度和高度将分配到最高有效 10 位,第二个砖块分配到最低有效 10 位。

这是我目前拥有的代码:

int i = 19;
initial
begin
 for(i=19; i>=0; i=i-10)
 begin
  assign Brick_Width[i:i-9] = 10;
  assign Brick_Height[i:i-9] = 5;
 end
end

但是,我收到一条错误消息,指出“i”不是常数。关于我如何去做这件事的任何想法?

【问题讨论】:

  • 你的数组中有两个实体(高度和宽度),那么它应该是一个二维数组。即逻辑 [9:0] Brick_1 [5]
  • 当你有 logic[9:0] Brick_1 [5] 时,这是否意味着有 5 个单元,每个单元都有 10 位?
  • 是的。有 5 个单元格(深度为 5),每个单元格有 10 位(宽度为 10)。

标签: verilog system-verilog


【解决方案1】:

使用: 运算符的常用范围选择必须有一个常量。您的意图可以通过所谓的 bit-select 运算符来实现。

参考LRM 1800-2012 中的示例,第 11.5 节如下:

logic [31: 0] a_vect;
logic [0 :31] b_vect;
logic [63: 0] dword;
integer sel;
a_vect[ 0 +: 8] // == a_vect[ 7 : 0]
a_vect[15 -: 8] // == a_vect[15 : 8]
b_vect[ 0 +: 8] // == b_vect[0 : 7]
b_vect[15 -: 8] // == b_vect[8 :15]
dword[8*sel +: 8] // variable part-select with fixed width

+:-: 运算符必须用于 位切片或部分选择,就像您的情况一样。在这里,您要从ii-9 中选择一个部分,因此必须使用-: 运算符。赞Brick_Height[i-:9]=...

例如,

x +: Y, the start position is x and count up from x by Y. Y is necessarily a constant.
x -: Y, the start position is x and count down from x by Y. Y is necessarily a constant.

还有一件事,initial 块内的 assign 语句使其连续过程分配。在这种情况下,位选择将不起作用。为此,只需删除 assign 声明。如下:

for(i=19; i>=0; i=i-10)
 begin
    Brick_Width[i-:9] = 10; // no assign, rest all the stuff is same
    Brick_Height[i-:9] = 5;
 end

如果持续驾驶是意图,则使用生成块

genvar i;
generate
for(i=19; i>=0; i=i-10)
begin
    assign Brick_Width[i-:9] = 10;
    assign Brick_Height[i-:9] = 5;
end
endgenerate

有关位选择的更多信息,请访问this 链接。

旁注:

在您的问题中引用以下短语:

对于两块砖,我有以下代码:

你必须有一个像logic[9:0] Brick [2]这样的数组

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多