Перейти к содержанию
    

Verilog, переменные в индексах массивов

Вроде бы допускаются только константы. Однако Код 1 вполне синтезируется, во всяком случае в Квартусе

Код 1

module MyModule(output reg [7:0]REG, input L, input [7:0]D, input C);
	
	reg [7:0]REGA;
	always @(posedge C)
		if(L) REGA <= D;

	//переворот шины
	always @(*)
	begin
		integer i;
		for(i=0; i<=7; i=i+1)
			REG[i] = REGA[7-i];
	end
	
endmodule

 

Теперь хочу сделать упаковку неупакованного массива, для передачи его в другой модуль, Код 2, и получаю такое сообщение

Error (10734): Verilog HDL error at MyModule.v(17): i is not a constant

Код 2

module MyModule(output reg [31:0]REG, input [1:0]L, input [7:0]D, input C);
	
	reg [7:0]REGA[3:0];
	
	always @(posedge C)
		case(L)
			2'd0: REGA[0] <= D;
			2'd1: REGA[1] <= D;
			2'd2: REGA[2] <= D;
			2'd3: REGA[3] <= D;
		endcase
	
	always @(*)
	begin
		integer i;
		for(i=0; i<=3; i=i+1)
			REG[8*i+7:8*i] = REGA[i][7:0];
	end
endmodule

Можно подумать не допускаются переменные в индексах массивов регистров. Но нет! Код 3 тоже синтезируется безо всяких проблем.

Код 3

module MyModule(output reg [31:0]REG, input [1:0]L, input [7:0]D, input C);
	
	reg [7:0]REGA[3:0];
	reg [7:0]REGB[3:0];

	always @(posedge C)
	begin
		case(L)
			2'd0: REGA[0] <= D;
			2'd1: REGA[1] <= D;
			2'd2: REGA[2] <= D;
			2'd3: REGA[3] <= D;
		endcase
	end
	
	//переворот шин
	always @(*)
	begin
		integer i, j;
		for(j=0; j<=3; j=j+1)
			for(i=0; i<=7; i=i+1)
				REGB[j][i] = REGA[j][7-i];
	end
	
	always @(*) REG = {REGB[3], REGB[2], REGB[1], REGB[0]};

endmodule

Так в чём же принципиальная разница между Кодом 2 и Кодом 3?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Jackov сказал:

Код 2

for(i=0; i<=3; i=i+1)
	REG[8*i+7:8*i] = REGA[i][7:0];

Кажись разобрался, вот так работает

for(i=0; i<=31; i=i+1)
	REG[i] = REGA[i/8][i%8];

Т.е. не допускаются переменные в левой части присвоения. Странно как-то конечно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Jackov said:

Т.е. не допускаются переменные в левой части присвоения. Странно как-то конечно.

так то в стандарте об этом написано) ширина вектора должна быть фиксированная на этапе компиляции. Там же указан способ записи фиксированного вектора с переменным начальным индексом REG[8*i+7:8*i] = REG[8*i +: 8]. Там еще есть интересные вещи, поэтому все же рекомендую прочитать эту главу в стандарте. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, des00 сказал:

так то в стандарте об этом написано) ширина вектора должна быть фиксированная на этапе компиляции. Там же указан способ записи фиксированного вектора с переменным начальным индексом REG[8*i+7:8*i] = REG[8*i +: 8]. Там еще есть интересные вещи, поэтому все же рекомендую прочитать эту главу в стандарте. 

Прошу пардону, оговорился:

Не допускаются переменные вычисления в левой части присвоения.

Стандарт посмотрел, в главе 3.10 ничего такого не нашёл, есть только вот такая туманная фраза:

Цитата

Nor can complete or partial array dimensions be used to provide a value to an expression. To assign a value to an element of an array, an index for every dimension shall be specified. The index can be an expression.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, Jackov said:

Стандарт посмотрел, в главе 3.10 ничего такого не нашёл, есть только вот такая туманная фраза:

Потому что, как минимум, нужно было смотреть главу 11.5.1 Vector bit-select and part-select addressing  на примере IEEE Std 1800-2012

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, Jackov сказал:

Прошу пардону, оговорился:

Не допускаются переменные вычисления в левой части присвоения.

Стандарт посмотрел, в главе 3.10 ничего такого не нашёл, есть только вот такая туманная фраза:

Вам правильно подсказал des00. Не допускается переменное значение ширины, а в записи REG[8*i +: 8] ширина постоянна.
Да, в стандарте об этом написано - читайте внимательнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 12.03.2023 в 19:02, Jackov сказал:

Кажись разобрался, вот так работает

for(i=0; i<=31; i=i+1)
	REG[i] = REGA[i/8][i%8];

always @(posedge C)
 REG[8*L +:8] <= D;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 13.03.2023 в 12:56, TRILLER сказал:

Вам правильно подсказал des00. Не допускается переменное значение ширины, а в записи REG[8*i +: 8] ширина постоянна.
Да, в стандарте об этом написано - читайте внимательнее.

Да, так, запутался немного.

 

В 14.03.2023 в 19:27, sazh сказал:

+:

Не так давно об этом операторе узнал, кстати.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...