为什么我的输出没有被赋值?

2023-11-29

我正在为一个更大项目的一部分开发解码器。我有两个计数器充当该模块的输入。其中一个计数器计数 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

Simulation Output: Link to Verilog Simulation Screenshot


由于争用,您的输出会得到 X。out_W测试台中有 2 个驱动程序:wire,它持续驱动0,并且Decoder_W模块,驱动 1,然后驱动 'hffff_ffff。

要修复此问题,请不要为wire。改变:

wire [31:0] out_W = 0;

to:

wire [31:0] out_W;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的输出没有被赋值? 的相关文章

  • Verilog 位更改位置

    假设我有一个寄存器reg 15 0 my reg 其中包含一个16位signed sample 如何找到第一位变化的位置 意思是 如果假设my reg 16 b0001011011010111 我怎么知道第一个变化是0 to 1 is at
  • Quartus Prime 中的“多个常量驱动程序”Verilog 错误

    我正在致力于用 Verilog 设计一个有限状态机来表示堆栈 该模块如下 module state machine s Enable Clock Resetn c OF Err UF Err input 2 0 s input Enable
  • 计算数组中的个数

    我试图在 Verilog 中计算 4 位二进制数中 1 的数量 但我的输出是意外的 我尝试了几种方法 这是我认为应该有效的方法 但事实并非如此 module ones one in input 3 0 in output 1 0 one a
  • Verilog HDL 循环语句错误:具有非常量循环条件的循环必须终止

    我对 Verilog 完全陌生 对于我在大学学习的课程 我必须很快了解它的很多内容 我正在摆弄我的 Altera DE2 板和 quartis2 并了解其细节 我正在尝试制作一个通过开关打开和关闭的计数器 到目前为止 计数器根据按键进行计数
  • |变量在verilog中是什么意思?

    我想知道什么assign hd trs detected hd trs match Verilog 中的意思 我最感兴趣的是 hd trs match部分 我知道 表示按位或 但不确定如何解释它之前没有值 它是可理解的 1 还是 0 如果它
  • Verilog 奇怪的仿真结果综合后

    我面临一个奇怪的问题 该代码适用于简单的 ALU 仅将感兴趣的代码粘贴到此处 always posedge clk or posedge rst begin if rst 1 begin mul valid shr 3 b000 end e
  • 如何在 Verilog 中定义带参数的模块?

    我想定义一个add有一个参数的模块 但我对新实例的声明进展不顺利 我想定义这个模块的一个实例 module add parameter wd 1 input wire wd 1 0 a b output wire wd 1 0 o assi
  • 使用数据流模型的T触发器

    我正在尝试模拟 t flipflop 的工作 timescale 1ns 1ps module t flipflop input t input clk input clear output q output qbar wire sbar
  • 简单赋值时不输出期望值

    当我将一些值分配给具有四位的变量时 当我简单地输出该值时 我会得到意想不到的结果 我以前从未见过这个 想知道我是否在语法上做错了什么 module main reg 3 0 x initial begin monitor b x x 001
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • 将枚举转换为逻辑

    考虑以下模块声明 module DFF d q CLK RESET parameter W 2 input W 1 0 d input CLK input RESET output logic W 1 0 q endmodule 当 d 和
  • verilog 中的“<<”运算符

    我有一个verilog代码 其中有一行如下 parameter ADDR WIDTH 8 parameter RAM DEPTH 1 lt lt ADDR WIDTH 这里将存储什么RAM DEPTH以及什么是 lt lt 操作员在这里做
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 向左旋转 verilog 大小写

    我的任务是用verilog编写一个16位ALU 当我做需要旋转操作数和进行2的补码加法和减法的部分时 我发现了困难 我知道如何用纸和铅笔解决这个问题 但我无法弄清楚如何在 Verilog 中做到这一点 例如 A表示为a15 a14 a13
  • 如何在Verilog中将二维数组中的所有位设置为0?

    我构建了一个 8 2bits 数组来表示 Verilog 中的一块内存 reg 1 0 m 0 7 该存储器有一个复位信号 如果复位为1 则该存储器中的所有位都应重置为0 但是我不知道如何以简洁的方式设置m的所有位 因为如果有数百个内存中有
  • Verilog 中的大括号是什么意思?

    我很难理解 Verilog 中的以下语法 input 15 0 a 16 bit input output 31 0 result 32 bit output assign result 16 a 15 a 15 0 我知道assign语句
  • 我怎样才能让我的verilog移位器更通用?

    这里我有一个移位器 但现在它最多只能工作 3 位 我一直在寻找 但不知道如何让它工作最多 8 位 module shifter a b out input 7 0 a b output 7 0 out wire 7 0 out1 out2
  • 使用正则表达式进行 Verilog 端口映射

    我有一个很长的端口映射 我想在其中替换一堆 SignalName i with SignalName SignalName i 我想我可以用正则表达式轻松地做到这一点 但我无法弄清楚如何做到这一点 有任何想法吗 假设 SignalData

随机推荐