我最近在verilog/systemverilog代码中看到了这个运算符.
logic [15:0] down_vect;
logic [0:15] up_vect;
down_vect[lsb_base_expr +: width_expr]
up_vect [msb_base_expr +: width_expr]
down_vect[msb_base_expr -: width_expr]
up_vect [lsb_base_expr -: width_expr]
Run Code Online (Sandbox Code Playgroud)
我很少见到这一点,我想问一下这是什么,何时以及如何使用它?
我在Verilog有一个大约95个案例的案例结构.
case(address)
5'd0: header_buffer[7:0] <= writedata;
5'd1: header_buffer[15:8] <= writedata;
5'd2: header_buffer[23:16] <= writedata;
5'd3: header_buffer[31:24] <= writedata;
Run Code Online (Sandbox Code Playgroud)
如您所见,有一种非常可预测的模式.有没有更好的方法来编写这个,这样我就不必手动写出所有的情况,以便我可以将它扩展到任意大的大小,如100或200个案例?似乎某种类型的for循环语法非常有用.
是否可以在verilog中创建参数数组?例如,类似以下内容:
parameter[TOTAL-1 : 0] PARAM_ARRAY = {1, 0, 0, 2}
Run Code Online (Sandbox Code Playgroud)
如果不可能,那可能是替代解决方案?
提前致谢
我有这样创建的三根电线:
wire [11:0] magnitude;
wire [3:0] bitsEnd;
wire [3:0] leadingBits;
Run Code Online (Sandbox Code Playgroud)
所有这些都assign使用组合逻辑进行了一些表达式。以下代码工作正常:
assign leadingBits[3] = magnitude[bitsEnd + 3];
assign leadingBits[2] = magnitude[bitsEnd + 2];
assign leadingBits[1] = magnitude[bitsEnd + 1];
assign leadingBits[0] = magnitude[bitsEnd + 0];
Run Code Online (Sandbox Code Playgroud)
但是,以下(看似等效的)代码给出了错误bitsEnd is not a constant:
assign leadingBits[3:0] = magnitude[bitsEnd + 3:bitsEnd];
Run Code Online (Sandbox Code Playgroud)
我不能在这个作业中使用速记吗?为什么在第二种情况下会出现这个错误而不是第一种情况?
我正在尝试创建一个for循环,在循环迭代的情况下为逻辑数组分配不同的值.
所以,例如,假设我试图实例化两个不同的砖,宽度为10,高度为5.我们也说这些值都是10位.对于两块砖,我有代码:
logic[19:0] Brick_Width;
logic[19:0] Brick_Height;
Run Code Online (Sandbox Code Playgroud)
第一块砖的宽度和高度将被分配到最重要的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
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个错误,说"我"不是一个常数.关于如何做到这一点的任何想法?