对verilog来说非常新。Can';不要在循环中赋值

对verilog来说非常新。Can';不要在循环中赋值,verilog,Verilog,我对verilog非常陌生,不确定使用什么数据类型。我试图迭代一个二进制数,并对每一位进行异或运算。我可以手动执行此操作,但无法将其存储到其他注册表中 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);

我对verilog非常陌生,不确定使用什么数据类型。我试图迭代一个二进制数,并对每一位进行异或运算。我可以手动执行此操作,但无法将其存储到其他注册表中

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
模块迭代器(a,b);
输入[3:0]a;
输入[3:0]b;
整数i=0;
reg[3:0]c=4'b0000;
始终@(a或b)开始
$display(“p=%b”,p);
对于(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]);
结束
端模
模块测试台;
reg[3:0]a=4'b1001;
reg[3:0]b=4'b0110;
迭代器it(a,b);
端模
只需指出:

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

(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]);
结束
2:没有变量“p”表明这不是您使用的代码(语法错误)

3:您的代码没有输出。您可以EXOR位,但没有返回结果,因为您没有输出端口

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


但如果您使用toolic的代码,所有这些都会消失。

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

在始终块
a
b
中,如果其中任何一个发生变化,则触发块内代码执行的信号

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

如果要合成此代码,请记住,HDL中的循环将展开,并且每个循环迭代都将复制逻辑。它们可能会占用目标硬件上的大量空间。
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