假设我们有MSB_limit
和LSB_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
答案 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