Почему моему выводу не присваивается значение? - PullRequest
1 голос
/ 18 марта 2020

Я работаю над декодером для части более крупного проекта. У меня есть два счетчика, которые действуют как вход для этого модуля. Один из них считает 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

Вывод моделирования: Link to Verilog Simulation Screenshot

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Вы получаете X на выходе из-за конфликта. out_W в тестовом стенде имеет 2 драйвера: wire, который постоянно управляет 0, и модуль Decoder_W, который управляет 1, затем 'hffff_ffff.

Чтобы исправить это, не назначайте значение до wire. Изменить:

wire [31:0] out_W = 0;

на:

wire [31:0] out_W;
0 голосов
/ 18 марта 2020

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
...