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

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和wire有什么区别?

    在verilog模块中我们什么时候应该使用reg以及什么时候应该使用wire 我还注意到有时输出会再次声明为 reg 例如 D 触发器中的 reg Q 我在某处读过这个 过程赋值语句的目标输出必须是 reg 数据类型 什么是程序赋值语句 我
  • 计算数组中的个数

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

    我对 Verilog 完全陌生 对于我在大学学习的课程 我必须很快了解它的很多内容 我正在摆弄我的 Altera DE2 板和 quartis2 并了解其细节 我正在尝试制作一个通过开关打开和关闭的计数器 到目前为止 计数器根据按键进行计数
  • 比较数字进行排序然后得到中值

    使用按位或比较运算符对五个整数进行排序可以通过以下方式实现 首先获取最大的数字 然后获取第二大的数字 然后获取第三大的数字 依此类推 这是我获取最高数字的代码 include
  • 如何在 verilog 中不使用 while() 循环(用于综合)?

    我已经养成了开发大量测试平台并使用 for 和 while 循环进行测试的习惯 没关系 问题是我已经将这种习惯用于对应该可综合的电路进行编码 XST等拒绝合成代码 无需对合成参数进行额外修改 例如 while num lt test num
  • 信号连接到以下多个驱动器

    我尝试运行以下命令并收到此错误 这是 Verilog 代码 module needle input referrence input penalty output index 7 0 inout input itemsets input r
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 在逻辑中使用单端端口期待差异对?

    我使用的逻辑被设置为需要一个差分对时钟端口 然而 对于一个特定的应用程序 我只能输入一个单端时钟 由于硬件限制 修改逻辑以接受单端时钟不是一种选择 因为涉及许多文件和代码行 有没有办法可以输入单端端口并以某种方式将其馈送到模块的差异对端口
  • verilog 中的“<<”运算符

    我有一个verilog代码 其中有一行如下 parameter ADDR WIDTH 8 parameter RAM DEPTH 1 lt lt ADDR WIDTH 这里将存储什么RAM DEPTH以及什么是 lt lt 操作员在这里做
  • 如何获取值数组作为 plusargs?

    如何获取值数组作为参数 我需要从命令行获取一组未定义大小的命令 如何将这些参数放入数组或队列中 Eg CMDS READ WRITE READ N WRITE 它应该被带到一个数组中 value plusargs不支持数组 但支持字符串 看
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 标识符必须用端口模式声明:busy。 (Verilog)

    我有如下所示的 Verilog 代码 当我编译它时 我收到以下错误消息 并且代码的第一行突出显示 Error 标识符必须用端口模式声明 busy Code module main clk rst start busy ready cnt s
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻
  • verilog 中的案例陈述

    我遇到了优先级编码器设计 并找到了一种使用 case 语句来实现它的新方法 唯一令人困惑的是 case语句是否优先考虑case 例子 case 1 b1 A 3 Y lt 4 b1000 A 2 Y lt 4 b0100 A 1 Y lt
  • 如何在 icarus verilog 中包含文件?

    我知道基本的 include filename v 命令 但是 我试图包含另一个文件夹中的模块 现在 该模块还包括同一文件夹中存在的其他模块 但是 当我尝试在最顶层运行该模块时 出现错误 C Users Dell Desktop MIPS
  • Verilog 数组语法

    我是 Verilog 新手 并且遇到了很多麻烦 例如 我想要一个包含八个单元的数组 每个单元都是 8 位宽 以下不起作用 reg 7 0 transitionTable 0 7 assign transitionTable 0 10 仅仅做
  • 为什么我们在FGPA / VHDL / VIVADO中使用REG?

    我正在使用 Xilinx 的 vivado 在 verilog 中进行编程 我想知道为什么我们使用某些输出reg 例如reg 3 0 encoder output我们使用它是因为我们的 16 到 4 编码器有 4 个输出 对吧 我假设我们使

随机推荐