Я пытаюсь создать синтезируемый, параметризованный кодер приоритета в Verilog. В частности, я хочу, чтобы найти значащий 1 в векторе и возвращает вектор, содержащий только что 1. Например:Сгенерировать, если выписки в Verilog
IN[3:0] | OUT[4:0]
--------+---------
1010 | 00010
1111 | 00001
0100 | 00100
0000 | 10000 (special case)
Таким образом, если векторы четыре бита, код:
if (in[0]==1'b1) least_one = 1;
else if (in[1]==1'b1) least_one = 2;
else if (in[2]==1'b1) least_one = 4;
else if (in[3]==1'b1) least_one = 8;
else out = 16; // special case in==0, set carry bit
Мне нужен общий, масштабируемый способ сделать это, потому что длина вектора ввода/вывода параметризована. Мой текущий код:
module least_one_onehot
#(parameter ADDR_WIDTH=4)
(output reg [ADDR_WIDTH:0] least_one,
input [ADDR_WIDTH-1:0] in);
genvar i;
always @(in) begin
if (in[0]==1'b1) least_one = 1;
generate for (i=1; i<ADDR_WIDTH; i=i+1) begin : U
else if (in[i]==1'b1) least_one = 2**i;
end
endgenerate
else least_one = 2**ADDR_WIDTH;
end
endmodule
Когда я пытаюсь скомпилировать это я получаю следующие ошибки:
file: least_one_onehot.v
generate for (i=1; i<ADDR_WIDTH; i=i+1) begin : U
|
ncvlog: *E,GIWSCP (least_one_onehot.v,10|8): Generated instantiation can only be valid within a module scope [12.1.3(IEEE 2001)].
else if (in[i]==1'b1) least_one = 2**i;
|
ncvlog: *E,NOTSTT (least_one_onehot.v,11|6): expecting a statement [9(IEEE)].
endgenerate
|
ncvlog: *E,GIWSCP (least_one_onehot.v,13|12): Generated instantiation can only be valid within a module scope [12.1.3(IEEE 2001)].
else least_one = 2**ADDR_WIDTH;
|
ncvlog: *E,NOTSTT (least_one_onehot.v,14|5): expecting a statement [9(IEEE)]
Я пробовал различные варианты расположения генерации, если, и всегда заявления, все без успех. Кто-нибудь знает правильный синтаксис для этого? Реализация заявлений или других альтернатив также будет прекрасной. Благодарю.
Должно ли ваша ширина выходного сигнала соответствовать вашей ширине ввода? Что такое 'out'? – toolic
Существует разница между процедурными контекстами и контекстами модулей. См. [This] (http://stackoverflow.com/questions/10443368/unknown-verilog-error-expecting-endmodule/10449997#10449997) ответ. – 2013-02-26 03:34:29
Вывод должен быть в 1 бит шире, чем в случае необходимости для всего нуля. Я уточнил оригинальный пост. – DrDean