保持计算中的特定位

时间:2014-11-16 16:37:55

标签: verilog system-verilog

是否可以仅保留这样的计算中的最后X位?:

a_register <= some_addr - {some_addr[(width-1):limit],limit{1'b0}}
//can it be done in one line of code? Like:
//a_register <= some_addr - {some_addr[(width-1):limit],limit{1'b0}} [X:0]

2 个答案:

答案 0 :(得分:1)

您可以使用LSB的临时变量分配连接线,这应该使合成工具清楚地知道这些位未被使用并且可以被优化掉。

wire [4:0] temp;

assign {a_register, temp} = some_addr - {some_addr[(width-1):limit],limit{1'b0}};

reg [4:0] temp;

always @(posedge clk) begin 
  {a_register, temp} <= some_addr - {some_addr[(width-1):limit],limit{1'b0}};
end

答案 1 :(得分:0)

如果您只想保留计算的最后N位,则只需要使a_register大小为N.分配将仅采用计算的最后N位。如果由于某种原因需要a_register更大,则始终只能选择a_register的最后N位并指定值:

a_register[X:0] <= some_addr - {some_addr[(width-1):limit],limit{1'b0}};

你目前所做的不起作用;但是你总是可以使用临时值来存储计算结果并取[X:0]。{/ p>

assign temp = some_addr - {some_addr[(width-1):limit],limit{1'b0}};
...
a_register <= temp[X:0];

(虽然它不是1行)

相关问题