对verilog来说很新。无法在循环中分配值

时间:2018-04-30 18:18:42

标签: verilog

我对verilog很新,不确定要使用哪种数据类型。我试图迭代二进制数和xor每个位。我可以手动执行此操作,但我无法将其存储到其他注册表中。

module iterator(a, b);
    input [3:0] a;
    input [3:0] b;
    integer i = 0;
    reg [3:0] c = 4'b0000;

    always @ (a or b) begin
        $display("p = %b", p);
        for(i = 0; i < 4; i=i+1)
            c[i] = a[i] ^ b[i];
            $display("i = %d, a[i] = %b, b[i] = %b, a[i] ^ b[i] = %b", i, a[i], b[i], c[i]);
    end
endmodule

module Testbench;
    reg [3:0] a = 4'b1001;
    reg [3:0] b = 4'b0110;

    iterator it(a, b);
endmodule

2 个答案:

答案 0 :(得分:2)

只是要指出:

1:您的显示语句未对齐。它不在for循环中。 (这不是python感谢上帝!)使用:

for(i = 0; i < 4; i=i+1)
begin
   c[i] = a[i] ^ b[i];
   $display("i = %d, a[i] = %b, b[i] = %b, a[i] ^ b[i] = %b", i, a[i], b[i], c[i]);
end

2:没有变量&#39; p&#39;这表明这不是您使用的代码(语法错误)。

3:您的代码没有输出。你EXOR位但由于没有输出端口而没有返回结果。

4:将c初始化为4&b; b0000并不总是合成的。这是一个坏习惯,除非绝对必要,否则应该避免。 (这不在这里)。

但如果你使用工具代码,那一切都会消失。

答案 1 :(得分:0)

为了执行始终块内的代码,您需要确保更改敏感列表中变量的值。在您的示例中,您需要一个测试平台来执行此操作。

在您的始终块中ab是触发块内代码执行的信号,如果它们中的任何一个发生变化。

always @ (a or b) begin
    $display("p = %b", p);

要提供此类更改,您可以执行以下操作:

module Testbench;
    reg [3:0] a;
    reg [3:0] b;

    iterator it(a, b);

    initial begin
        a = 4'b1001;
        b = 4'b0110;
       #2
        a = 4'b0110;
        b = 4'b1111;
       #2 
      ...
    end
endmodule