【问题标题】:Why is my output not getting assigned a value?为什么我的输出没有被赋值?
【发布时间】:2020-03-17 22:18:53
【问题描述】:

我正在为一个较大项目的一部分开发解码器。我有两个计数器作为这个模块的输入。其中一个计数 0 - 15,当第一个计数器达到 15 时,另一个增加一次。根据计数器的值,解码器输出不同的值。通常它是 0、1 或 -1,但有时它必须是 0.707 或 -0.707,我们暂时使用定点数来处理它。

我遇到的问题是,我的测试代码无法在计数器开始运行后立即分配输出。我已经将我的模拟代码简化为一个非常简单的测试,在该测试中我非常快速地触发复位,然后将第一个计数器分配为 1,然后将第二个计数器分配为 1,这应该使解码器将 1 分配给输出。它卡在输出“XXXXXX”。

在此之前,我有一长串执行分配的“else if”语句,我遇到了同样的错误。

我很肯定这个错误很简单,但我只是没能看到它。

Verilog 代码:

`timescale 1ns / 1ps

module Decoder_W
(
    input clk,
    input rst,
    input [31:0] counter,
    input [31:0] stage_counter,
    output reg [31:0] out_W
);

always @ (posedge(clk)) 
begin

if (rst == 1)
    out_W <= 0;

else if (stage_counter == 32'd1)
    begin 
        case (counter)
            32'd0: out_W <= 1;
            32'd1: out_W <= -1;
            32'd2: out_W <= 1;
            32'd3: out_W <= -1;
            32'd4: out_W <= 1;
            32'd5: out_W <= -1;
            32'd6: out_W <= 1;
            32'd7: out_W <= -1;
            32'd8: out_W <= 0;
            32'd9: out_W <= 0;
            32'd10: out_W <= 0;
            32'd11: out_W <= 0;
            32'd12: out_W <= 0;
            32'd13: out_W <= 0;
            32'd14: out_W <= 0;
            32'd15: out_W <= 0; 
            default out_W <= 0;
        endcase
     end

else if (stage_counter == 32'd2)
    begin
        case (counter)
            32'd0: out_W <= 1;
            32'd1: out_W <= 0;
            32'd2: out_W <= -1;
            32'd3: out_W <= 0;
            32'd4: out_W <= 1;
            32'd5: out_W <= 0;
            32'd6: out_W <= -1;
            32'd7: out_W <= 0;
            32'd8: out_W <= 0;
            32'd9: out_W <= -1;
            32'd10: out_W <= 0;
            32'd11: out_W <= 1;
            32'd12: out_W <= 0;
            32'd13: out_W <= -1;
            32'd14: out_W <= 0;
            32'd15: out_W <= 1;
            default out_W <= 0;       
         endcase
     end

else if (stage_counter == 32'd3)
    begin
        case (counter)
            32'd0: out_W <= 1;
            32'd1: out_W <= 0;
            32'd2: out_W <= 0;
            32'd3: out_W <= 32'b11111111111111111110100101100000;
            32'd4: out_W <= -1;
            32'd5: out_W <= 32'b11111111111111111110100101100000;
            32'd6: out_W <= 0;
            32'd7: out_W <= 32'b00000000000000000001011010100000;
            32'd8: out_W <= 0;
            32'd9: out_W <= 32'b11111111111111111110100101100000;
            32'd10: out_W <= -1;
            32'd11: out_W <= 32'b11111111111111111110100101100000;
            32'd12: out_W <= 0;
            32'd13: out_W <= 32'b00000000000000000001011010100000;
            32'd14: out_W <= 1;
            32'd15: out_W <= 32'b00000000000000000001011010100000;
            default out_W <= 0;       
         endcase
     end

else
    out_W <= 0;

end
endmodule

测试台:

`timescale 1ns / 1ps

module testbench;

reg clk = 0;
reg rst = 0;
reg [31:0] counter = 0;
reg [31:0] stage_counter = 0;
wire [31:0] out_W = 0;

Decoder_W test
(
    .clk(clk),
    .rst(rst),
    .counter(counter),
    .stage_counter(stage_counter),
    .out_W(out_W)
);

integer i = 0;

always #5 clk = ~clk;
initial 
begin
#10 rst = 0;
#10 rst = 1;
#10 rst = 0;
#10 stage_counter = 1;
#10 counter = 0;
#10 counter = 1;
#30

$finish;
end
endmodule

模拟输出:

【问题讨论】:

    标签: verilog


    【解决方案1】:

    由于争用,您在输出中得到 X。测试台中的out_W 有 2 个驱动程序:wire,它不断驱动 0,以及Decoder_W 模块,它驱动 1,然后驱动 'hffff_ffff。

    要修复它,不要为wire 赋值。变化:

    wire [31:0] out_W = 0;
    

    到:

    wire [31:0] out_W;
    

    【讨论】:

      【解决方案2】:

      out_W 是一条输出线,因此您不应该初始化它。试试下面的代码。

      `timescale 1ns / 1ps
      
       module testbench;
      
        reg clk;
        reg rst;
        reg [31:0] counter;
        reg [31:0] stage_counter;
        wire [31:0] out_W;
      
        Decoder_W test
        (
          .clk(clk),
          .rst(rst),
          .counter(counter),
          .stage_counter(stage_counter),
          .out_W(out_W)
         );
      
         integer i = 0;
      
         always #5 clk = ~clk;
         initial 
         begin
               clk = 0;
               rst = 0;
               counter = 0;
               stage_counter = 0;
           #10 rst = 1;
           #10 rst = 0;
           #10 stage_counter = 1;
           #10 counter = 0;
           #10 counter = 1;
           #30
          $finish;
        end
       endmodule
      

      【讨论】:

        猜你喜欢
        • 2011-11-14
        • 2020-02-01
        • 1970-01-01
        • 2019-12-21
        • 2013-10-16
        • 1970-01-01
        • 2021-11-27
        • 2020-05-12
        • 1970-01-01
        相关资源
        最近更新 更多