Jackov 1 12 марта, 2023 Опубликовано 12 марта, 2023 · Жалоба Вроде бы допускаются только константы. Однако Код 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 12 марта, 2023 Опубликовано 12 марта, 2023 · Жалоба 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]; Т.е. не допускаются переменные в левой части присвоения. Странно как-то конечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 12 марта, 2023 Опубликовано 12 марта, 2023 · Жалоба 1 hour ago, Jackov said: Т.е. не допускаются переменные в левой части присвоения. Странно как-то конечно. так то в стандарте об этом написано) ширина вектора должна быть фиксированная на этапе компиляции. Там же указан способ записи фиксированного вектора с переменным начальным индексом REG[8*i+7:8*i] = REG[8*i +: 8]. Там еще есть интересные вещи, поэтому все же рекомендую прочитать эту главу в стандарте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 12 марта, 2023 Опубликовано 12 марта, 2023 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 13 марта, 2023 Опубликовано 13 марта, 2023 · Жалоба 5 hours ago, Jackov said: Стандарт посмотрел, в главе 3.10 ничего такого не нашёл, есть только вот такая туманная фраза: Потому что, как минимум, нужно было смотреть главу 11.5.1 Vector bit-select and part-select addressing на примере IEEE Std 1800-2012 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 13 марта, 2023 Опубликовано 13 марта, 2023 · Жалоба 11 часов назад, Jackov сказал: Прошу пардону, оговорился: Не допускаются переменные вычисления в левой части присвоения. Стандарт посмотрел, в главе 3.10 ничего такого не нашёл, есть только вот такая туманная фраза: Вам правильно подсказал des00. Не допускается переменное значение ширины, а в записи REG[8*i +: 8] ширина постоянна. Да, в стандарте об этом написано - читайте внимательнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 3 14 марта, 2023 Опубликовано 14 марта, 2023 · Жалоба В 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 4 июля, 2023 Опубликовано 4 июля, 2023 · Жалоба В 13.03.2023 в 12:56, TRILLER сказал: Вам правильно подсказал des00. Не допускается переменное значение ширины, а в записи REG[8*i +: 8] ширина постоянна. Да, в стандарте об этом написано - читайте внимательнее. Да, так, запутался немного. В 14.03.2023 в 19:27, sazh сказал: +: Не так давно об этом операторе узнал, кстати. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться