Pracuję nad dekoderem na część większego projektu. Mam dwa liczniki, które działają jako wejście do tego modułu. Jednym z nich liczy się 0 - 15, a kolejne przyrosty raz, gdy pierwszy licznik osiągnie 15. W zależności od wartości liczników, dekoder wyjściowy o innej wartości. Zwykle jest ono albo 0, 1, albo -1, ale czasami musi wynosić 0,707 lub -0,707 i tymczasowo używamy numerów stałych punktów, aby poradzić sobie z tym.

Problemem, który mam, jest to, że z moim kodem testowym nie mogę uzyskać przypisania mojego wyjścia, gdy tylko zacznie działać liczniki. Zredukowałem mój kod symulacyjny do bardzo prostego testu, w którym wyczerpuję i wyłączyć reset i wyłączyć naprawdę szybko, a następnie przypisuję pierwszy licznik, aby wynosić 1, a następnie drugi licznik ma 1, który powinien dokonać dekodera przypisania 1 do wyjścia. To utknęło wyprowadzenie "xxxxxx".

Wcześniej miałem długą listę "indziej, jeśli" oświadczenia wykonujące zadania i miałem ten sam błąd.

Jestem pewien, że błąd jest naprawdę prosty, ale po prostu nie byłem w stanie go zobaczyć.

Kod 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

Testbench:

`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

Wyjście symulacyjne: Link do Screenshot Symulacji Verilog

1
neko_lyn 18 marzec 2020, 01:18

2 odpowiedzi

Najlepsza odpowiedź

Dostajesz X na produkcję z powodu konwencji. out_W W Testbench ma 2 sterowniki: wire, która stale prowadzi 0, a moduł Decoder_W, który napędza 1 wtedy "HFFFFF_FFFF.

Aby go naprawić, nie przypisz wartości do wire. Zmiana:

wire [31:0] out_W = 0;

Do:

wire [31:0] out_W;
2
toolic 17 marzec 2020, 22:40

Out_W jest drutem wyjściowym, więc nie powinieneś go initować. Wypróbuj poniższy kod.

`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
-1
Pradyuman Bissa 18 marzec 2020, 11:41