Verilog: циклические экземпляры в иерархическом пути

Google дал мне этот ответ как результат, поэтому ...

Мне на самом деле нужно было «сохранить» строку как целое, для привязки между C и JavaScript, поэтому я конвертирую строку в целочисленное значение:

/*
    Examples:
        int2str( str2int("test") ) == "test" // true
        int2str( str2int("t€st") ) // "t¬st", because "€".charCodeAt(0) is 8364, will be AND'ed with 0xff
    Limitations:
        max 4 chars, so it fits into an integer
*/
function str2int(the_str) {
    var ret = 0;
    var len = the_str.length;
    if (len >= 1) ret += (the_str.charCodeAt(0) & 0xff) <<  0;
    if (len >= 2) ret += (the_str.charCodeAt(1) & 0xff) <<  8;
    if (len >= 3) ret += (the_str.charCodeAt(2) & 0xff) << 16;
    if (len >= 4) ret += (the_str.charCodeAt(3) & 0xff) << 24;
    return ret;
}
function int2str(the_int) {
    var tmp = [
        (the_int & 0x000000ff) >>  0,
        (the_int & 0x0000ff00) >>  8,
        (the_int & 0x00ff0000) >> 16,
        (the_int & 0xff000000) >> 24
    ];
    var ret = "";
    for (var i=0; i<4; i++) {
        if (tmp[i] == 0)
            break;
        ret += String.fromCharCode(tmp[i]);
    }
    return ret;
}
-1
задан dave_59 15 January 2019 в 19:49
поделиться

2 ответа

Потенциально вы можете реализовать что-то подобное, используя генерацию блоков. Хотя это будет немного отличаться от того, что у вас есть. Генерирующие блоки создают имена блоков, которые содержат индексацию, на которую можно ссылаться из других генерирующих блоков.

В следующем примере иерархически создаются экземпляры regA и regB. последний содержит переменную REG. Приведенный ниже код инициализирует REG иерархически (используя блок initial). Инициализация и верхняя реализация выполняются в модуле top. Вы можете скомпилировать его и посмотреть результаты.

Кстати, если вы компилируете в режиме системного verilog, вы можете избавиться от generate/endgenerate ключевых слов и использовать синтаксис i++.

module top();
  regTOP regTOP();

  genvar i, j, k;

  generate
    for (i = 0; i < 3; i = i + 1) begin
      for (j = 0; j < 3; j = j + 1) begin
        for (k = 0; k < 3; k = k + 1) begin
          initial regTOP.R[i].regA.R[j].regB.REG[k] = (i << 4) | (j << 2) | k;
        end
      end
    end
  endgenerate
endmodule

module regA();
  genvar i;
  generate
    for(i = 0; i < 3; i = i + 1) begin: R
      regB regB();
    end
  endgenerate

endmodule

module regB();
  integer i;
  reg[6:0] REG[3:0];

  always @*
    for (i=0; i < 3; i = i + 1)
      $display("%m: reg[%0d]=%0d", i, REG[i]);
endmodule

module regTOP();
  genvar i;
  generate
    for (i = 0; i < 3; i = i + 1) begin: R
      regA regA();
    end
  endgenerate
endmodule
0
ответ дан Serge 15 January 2019 в 19:49
поделиться

Если список соединений создал такие имена, как IREG3_0_, IREG3_1_, ... IREG3_31_, нет способа создать циклические операторы, обращающиеся к части _ NNN _. Вы могли бы также использовать IREG3_dog_, IREG3_milk_, ... чтобы назвать свои индексы.

Вам нужно получить список соединений, чтобы сохранить массив экземпляров, чтобы вы могли обращаться к ним как к вложенному циклу. Или вам может понадобиться написать список соединений вручную.

0
ответ дан dave_59 15 January 2019 в 19:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: