2014-11-20 65 views
4

假設我們有MSB_limitLSB_limit。這兩個標記和之間的所有位之間(即使是1的 - 我認爲這簡化了問題)必須去。填寫0與1的兩個1之間(可合成)

有沒有可綜合的解決方案呢?

實施例的問題:

MSB_limit = 7; 
LSB_limit = 2; 

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

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

回答

2
unsigned int my_reg = 1<<(MSB_limit-LSB_limit+1); // 0000000001000000 
my_reg --; // 0000000000111111 
my_reg <<= LSB_limit; // 0000000011111100 
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 
+0

鼓勵RTL /合成代碼使用'for'循環嗎?爲什麼有人會選擇這種風格與其他2個答案? (優點,缺點等) – user2692669 2014-11-21 01:35:26

+2

For循環用於RTL,並且可以在靜態展開時合成。與移位操作員相比,傾向於使用少量門和更好的時間。複製只適用於常量(例如:LSB/MSB_limit是參數)。通過動態限制,for循環允許合成器決定使用組合解碼或移位寄存器。這取決於合成器的智能。在我的工作中,允許移動和複製以及靜態限制。動態限制首選For-Loop。嘗試所有的方法,並使用最適合您要求的方法。 – Greg 2014-11-21 02:01:48

3

複製操作符如何?

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

這隻適用於MSB_limit和LSB_limit同意的情況。 – Greg 2014-11-21 01:40:09