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;
}
Потенциально вы можете реализовать что-то подобное, используя генерацию блоков. Хотя это будет немного отличаться от того, что у вас есть. Генерирующие блоки создают имена блоков, которые содержат индексацию, на которую можно ссылаться из других генерирующих блоков.
В следующем примере иерархически создаются экземпляры 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
Если список соединений создал такие имена, как IREG3_0_
, IREG3_1_
, ... IREG3_31_
, нет способа создать циклические операторы, обращающиеся к части _ NNN _. Вы могли бы также использовать IREG3_dog_
, IREG3_milk_
, ... чтобы назвать свои индексы.
Вам нужно получить список соединений, чтобы сохранить массив экземпляров, чтобы вы могли обращаться к ним как к вложенному циклу. Или вам может понадобиться написать список соединений вручную.