【发布时间】:2017-09-29 08:00:25
【问题描述】:
我正在尝试在二维数组(代码 [i] [k])的特定位上分配值。这是一种网络类型。但是值没有被赋值。reg [3:0] code[0:3] 得到未知的逻辑值'X'。
这里是代码sn-p
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;
这个for循环属于always块。这里,code和codeLen是输出类型。
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] 已正确分配,但 code[i][k] 未正确分配。我试图分配第 i 个字节的第 k 位。
详情 我创建了一个模块,它接受 6 个输入并返回两个二维数组作为输出。
这是模块:
`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
always@(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
当我为 code[][] 赋值时,预计会执行以下循环。尽管不会设置 code[][] 的所有位。在调试过程中,当我进行赋值时,我发现没有赋值(code[i][k] =1 或 0)。它得到未知的逻辑值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
测试台:
`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
代码已在 ModelSim 2016 中编译 我刚开始学习verilog。所以我非常感谢你帮助我展示我的错误。 问候。
【问题讨论】:
-
欢迎来到 Stack Overflow。我怀疑这种行为是由您未发布的代码引起的。例如,
k和len是什么 - 可能是您的循环执行零次?请发布MCVE - 一些可编译代码的小块 - 以便其他人可以重现您的问题。 -
@MatthewTaylor,感谢您的回复。我已经上传了可编译模块和测试平台。我相信,当我分配代码[] []位时会执行循环。 k 和 len 在那个时候应该有必要的值。虽然我没有设置代码[][]的所有位。当我调试模块并进行该分配时,我发现行已执行但未分配 code[][]。
-
您的代码无法编译 - 请参阅 http://www.edaplayground.com/x/4uk4。我修复了它,然后模拟没有停止。你能(a)让它编译(MCVE 中的“C”)并(b)去掉一些额外的东西,只留下问题(MCVE 中的“M”)吗?
-
我的猜测是您在
len计算和使用静态函数时遇到问题。你能验证len不为零吗?你如何调试它?而且,顺便说一句,从 90 年代开始停止使用这种编码风格。系统verilog允许你从函数中返回值,使用自动函数。 -
@MatthewTaylor,我非常感谢您的努力。在复制/粘贴模块 generate_code 期间缺少寄存器声明。但是我能够找到解决方法。问候。
标签: system-verilog