为2D解包数组中的特定位赋值[system-verilog]

时间:2017-09-29 08:00:26

标签: system-verilog

我正在尝试为2D数组的特定位赋值(code [i] [k])。这是一种网络类型。但是没有赋值的值.reg [3:0]代码[0:3]得到了未知的逻辑值' X'。

以下是代码段

            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循环属于始终块。其中,代码 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] 已正确分配,但未分配代码[i] [k] 。我试图分配第i个字节的第k位。

详细 我创建了一个模块,它接受6个输入并返回两个2维数组作为输出。

这是模块:

    `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

当我为代码[] []赋值时,预计会执行跟随循环。虽然不会设置所有代码[] []的位。在调试期间,当我进行分配时,我发现没有分配值(代码[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。所以我非常感谢你的帮助,以表明我的错误。 问候。

1 个答案:

答案 0 :(得分:0)

我解决了我的问题。并非所有代码[] []都已设置。即使在设置该位之后,这也导致代码[] []中的未知逻辑值。初始化始终块中的所有代码[] []后,它就会得到解决。