在两个1之间填充0和1(可合成)

时间:2014-11-20 18:45:45

标签: verilog system-verilog

假设我们有MSB_limitLSB_limit。这两个标记作为两个标记,它们之间的所有位(即使是1 - 我认为这简化了问题)必须转到 1 。< / p>

是否有可综合的解决方案?

问题示例:

MSB_limit = 7;
LSB_limit = 2;

//Let's suppose our register is 16bits, desired output:

 0000000011111100
 ^       ^    ^ ^
 |       |    | |
15       7    2 0       //positions

3 个答案:

答案 0 :(得分:3)

使用for循环可轻松实现:

SystemVerilog(IEEE 1800):

logic [N-1:0] my_reg;
always_comb begin
  foreach(my_reg[idx])
     my_reg[idx] = idx inside {[LSB_limit:MSB_limit]};
end

Verilog(IEEE 1364-2001或更高版本):

reg [N-1:0] my_reg;
integer idx;
always @* begin
  for (idx = 0; idx < N; idx=idx+1) begin
    my_reg[idx] = (idx >= LSB_limit) && ( idx <= MSB_limit);
  end
end

答案 1 :(得分:3)

复制操作符怎么样?

assign out = { '0, { MSB_limit-LSB_limit+1{1'b1} }, { LSB_limit{1'b0} } };

答案 2 :(得分:2)

unsigned int my_reg = 1<<(MSB_limit-LSB_limit+1);  // 0000000001000000
my_reg --; // 0000000000111111
my_reg <<= LSB_limit; // 0000000011111100