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