【问题标题】:Comparison Not Functioning Like It Should比较没有发挥应有的作用
【发布时间】:2019-11-30 03:41:30
【问题描述】:

我正在尝试构建一个模块,该模块接受两个 16 位输入并根据比较信号评估某个表达式并发送一个真 (1) 值来选择输出(如果表达式被评估为真)。

这是我的源代码:

    module comparator(input [15:0] r15_register, sourceone_register , input [1:0] comp_signal, output reg choice);
    always @(*)begin
        if (comp_signal == 2'b00) begin
            //Check if soureceone is greater than r15.
            choice = (sourceone_register > r15_register)? 1:0;          
            end
        else if (comp_signal == 2'b01) begin
            //Check is sourceone is less than r15.
            choice = (sourceone_register <r15_register)? 1:0;
            end
        else if (comp_signal == 2'b10) begin
            //Check if sourceone is equal to r15.  
            choice = (sourceone_register == r15_register)? 1:0;
            end
        else
            choice <= 0;
    end 
endmodule

这是我的测试平台代码:

module comparator_fixture();
reg [15:0] r15_register, sourceone_register;
reg [1:0] comp_signal;
wire choice;

comparator utt(.r15_register(r15_register), .sourceone_register(soureone_register), .comp_signal(comp_signal), .choice(choice));

initial begin
    #20;
    comp_signal = 2'b00;
    //Sourceone is greater than r15.
    r15_register = 4;
    sourceone_register = 6;
    //Sourceone is less than r15.
    #10;
    comp_signal = 2'b01;
    r15_register = 6;
    sourceone_register = 4;
    //Sourceone is equal to r15.
    #10;
    comp_signal = 2'b10;
    r15_register =7;
    sourceone_register =7;
    #30;
    $stop;
end

结束模块

当给出comp_signal 时,它会将输出选择驱动到 X(未知状态),我无法弄清楚原因。有人可以提供一些建议吗?

【问题讨论】:

  • 什么时候将输出驱动到'x'?你模拟的所有60年代? “当一个 com_signal 给出时”是什么意思?
  • 当我说“当给出 comp_signal 时”我的意思是信号可以是 2'b00、2'b01 或 2'b10,并且取决于输入的内容,假设是比较 sourceone 的内容是否大于、小于或等于 r15 的内容。
  • 我上传了一个波形以显示它何时到达 X。感谢您的帮助。

标签: verilog


【解决方案1】:

我将您的代码放入 Vivado 并得到错误:

  • 未声明的符号 soureone_register,假定为默认网络类型线...
  • 意外的 EOF

我发现你的波形已经很“奇怪”了,因为 choice 为零,而其他任何东西都没有被赋值。所以无论你用来产生那个波形,它都不是你展示的代码。

在我修复错误后,choice 不再是 X。

【讨论】:

  • 你能给我解释一下错误吗?因为我没有收到这些错误,而且我也在使用 Vivado。当我在 Vivado 上点击运行模拟 > 行为模拟时会弹出该波形,所以我不确定为什么它是 0ns 到 20ns。
  • 关于仿真运行,我删除了声明选择为 0 的 else 语句,然后当我运行波形时,对于所有 60ns 的仿真,选择都是 X。在我看来,当 comp_signal 没有被赋予值时,由于最后一个 else 语句,选择变为 0,但是当它被赋予值时,它变为 X。
【解决方案2】:

发现我的错误,在我的夹具中,我在实例化过程中拼写“source”时出现了错误。修复拼写错误后,我已经包含了运行的波形。

Here is the waveform with the correct output of "choice".

【讨论】:

  • 很好,下一步是改进测试平台,以测试choice 在每种情况下是否变低:-)
  • 感谢您的所有帮助,我也将其添加到了测试平台中。
猜你喜欢
  • 2017-03-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多