我对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
答案 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)
为了执行始终块内的代码,您需要确保更改敏感列表中变量的值。在您的示例中,您需要一个测试平台来执行此操作。
在您的始终块中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