J'essaie d'attribuer une valeur à un bit spécifique d'un tableau 2D (code [i] [k]). C'est un type net. Mais la valeur n'étant pas assignée.reg [3: 0] code [0: 3] obtient la valeur logique inconnue 'X'.Affectation d'une valeur à un bit spécifique dans un tableau 2D non compressé [system-verilog]
Voici le code snippet
for(k=0;k<len;k++) begin
if (tc[k] == 1'b0) begin
code[i][k]= 1'b0;//----> value is not assigning as expected
end else begin
code[i][k]= 1'b1;// ---> value is not assigning as expected
end
end
codeLen[i] = len;
Cette boucle appartient à toujours block.Here, Code et codeLen est le type de sortie.
output [3:0] code[0:3];
output [3:0] codeLen[0:3];
reg [3:0] code[0:3];
reg [3:0] codeLen[0:3];
codeLen [i] est correctement affectée, mais pas le code [i] [k]. J'essayais d'assigner le k-ème bit du i-ème octet.
Détails J'ai créé un module qui prend 6 entrées et renvoie deux tableaux bidimensionnels en sortie.
Voici le module:
`timescale 1ns/1ps
module generate_code(CLK,nRST,nodes,nodeCount,characters,charCount,code,codeLen);
input CLK;
input nRST;
input integer nodeCount;//Total nodes in huffman tree
input integer charCount;//Total unique characters
input [6:0] characters[0:3];
input [23:0] nodes[0:6]; // total characters
output [3:0] code[0:3]; //[2:0] max code length <= total characters
output [3:0] codeLen[0:3];
reg [3:0] code[0:3];
reg [3:0] codeLen[0:3];
reg[3:0] tc;//temprary code reg. Holds a single bit in each byte
integer len=0;//code length
reg [23:0] tNode;
function void FindRoot;
reg [23:0] aNode;//local
integer i;
begin
for (i=0; i<nodeCount;i++) begin // For all nodes
aNode= nodes[i]; // aNode is current node
if (tNode[23:16] == aNode[14:7]) begin
tc[len]= tNode[15];//15th bit of nodes is codebit
len++;
//aNode is parent of tNode. Is it root?
if(aNode[23:16]==8'b0000_0000) begin//or frequency==nodeCount or node_id = 8'b1111_1111
return;
end else begin
tNode=aNode;
FindRoot();
end
end
end
end
endfunction
[email protected](posedge CLK or negedge nRST)
begin
if(!nRST) begin
// init
end
else begin
// Do code generation
integer i,j,k;
for(i= 0;i < charCount;i++) begin // For all character we are going to find codeword
for(j=0; j<nodeCount; j++) begin
tNode= nodes[j];//current node
if (characters[i] == tNode[6:0]) begin
// Got the character. tNode is a leaf nodes. Lets back track to root.
break;
end
end
len=0;
FindRoot();
for(k=0;k<len;k++) begin
if (tc[k] == 1'b0) begin
code[i][k]= 1'b0;
end else begin
code[i][k]= 1'b1;
end
end
//code[i]=2;
codeLen[i]= len;
end
end
end
endmodule
Quand je suis attribuer des valeurs au code [] [], il est prévu que la boucle suivante est exécutée. Bien que tous les bits de code [] [] ne seront pas définis. Pendant le débogage, quand je suis arrivé à l'assignation, j'ai trouvé que la valeur n'était pas assignée (code [i] [k] = 1 ou 0). Sa valeur logique obtenir inconnue X.
for(k=0;k<len;k++) begin
if (tc[k] == 1'b0) begin
code[i][k]= 1'b0;
end else begin
code[i][k]= 1'b1;
end
end
Testbench:
`timescale 1ns/1ps
module generate_code_test;
// Inputs
reg CLK;
reg nRST;
integer nodeCount=7;//Total nodes in huffman tree
integer charCount=4;//Total unique characters
reg [6:0] characters[0:3];
reg [23:0] nodes[0:6]; // total characters
// Outputs
wire [3:0] code[0:3]; //[2:0] max code length <= total characters
wire [3:0] codeLen[0:3];
generate_code uut (
.CLK(CLK),
.nRST(nRST),
.nodes(nodes),
.nodeCount(nodeCount),
.characters(characters),
.charCount(charCount),
.code(code),
.codeLen(codeLen)
);
initial begin
// Initialize Inputs
CLK = 0;
nRST = 0;
nodeCount= 7;
charCount= 4;
characters[0]= 7'b110_0001;
characters[1]= 7'b110_0010;
characters[2]= 7'b110_0011;
characters[3]= 7'b110_0100;
nodes[0] = 24'b0000_0011_0_0000_0001_110_0001;
nodes[1] = 24'b0000_0011_1_0000_0010_110_0011;
nodes[2] = 24'b0000_0101_1_0000_0011_111_1111;
nodes[3] = 24'b0000_0101_0_0000_0100_110_0010;
nodes[4] = 24'b1111_1111_1_0000_0101_111_1111;
nodes[5] = 24'b1111_1111_0_0000_0110_110_0100;
nodes[6] = 24'b0000_0000_0_1111_1111_111_1111;
// Wait 10 ns for global reset to finish
#10;
nRST = 1;
end
parameter DELAY = 1;
always
#DELAY CLK = ~CLK;
endmodule
Le code a été compilé en 2016 ModelSim Je viens de commencer l'apprentissage Verilog. Donc j'apprécierais vraiment votre aide pour montrer mes erreurs. Cordialement.
Bienvenue dans Stack Overflow. Je soupçonne que le comportement est causé par un code que vous n'avez pas publié. Par exemple, que sont 'k' et' len' - pourrait-il être votre boucle est exécutée zéro fois? Veuillez poster un [MCVE] (https://stackoverflow.com/help/mcve) - un petit bloc de code compilable - afin que quelqu'un d'autre puisse reproduire votre problème. –
@MatthewTaylor, Merci pour la réponse. J'ai téléchargé le module compilable avec testbench. Je crois que la boucle est exécutée quand j'attribue le bit de code [] []. k et len doivent avoir les valeurs nécessaires à ce moment-là. Bien que je ne mets pas tous les bits de code [] []. Quand je débogue le module et arrive à cette affectation, je trouve que la ligne est exécutée mais que le code [] [] n'est pas assigné. – rakibdana
Votre code ne compile pas - voir [http://www.edaplayground.com/x/4uk4](http://www.edaplayground.com/x/4uk4). Je l'ai réparé et la simulation ne s'est pas arrêtée. Pouvez-vous (a) le faire compiler (le "C" dans MCVE) et (b) enlever un peu de choses supplémentaires en ne laissant que le problème (le "M" dans MCVE)? –