我对Verilog HDL有一个奇怪的问题。 我在我的代码中发现,如果我将变量乘以2,那么 将该值分配给同一个变量,它会搞得一团糟。 有时候,simv程序甚至会崩溃。我最初需要这样做, 因为我有一个转换或旋转一定量的for循环。但, 然后我发现不仅移动相同的变量不起作用,而且 此外,加法,减法,乘法或除法也不起作用。
所以在我的代码示例中,如果将a设置为16'b0001_0000_1010_0101,并将b设置为3, 然后你得到16'b0000_0000_0000_0000的输出。请注意,我现在忽略了b ...我应该得到16'b0010_0001_0100_1010 ......但是出了点问题。
所以,这是我的代码文件test.v:
// ALU module.
module test(in1, in2, out1);
input [15:0] in1;
input [15:0] in2;
output reg [15:0] out1;
// Variables for shifting right and for rotating left or right.
reg [15:0] shiftedValue;
always@(in1, in2)
begin
assign shiftedValue = in1;
assign shiftedValue = shiftedValue * 2;
assign out1 = shiftedValue;
// This display value is correct!
// but it's still wrong in the test bench.
$display("out1 == %b", out1);
end
endmodule
module testStim;
reg [15:0] a;
reg [15:0] b;
wire [15:0] c;
// create ALU instance.
test myTest(a, b, c);
initial
begin
a = 16'b0001_0000_1010_0101;
b = 3;
#10
$display("op1In == %b, op1Out == %b", a, c);
$finish;
end
endmodule
这是运行simv后的输出(我删除了错误的垃圾......):
out1 == 0010000101001010
op1In == 0001000010100101, op1Out == 0000000000000000
谢谢, Erik W。
答案 0 :(得分:2)
您已完成所谓的程序连续分配。
常规连续作业和程序性连续作业之间的区别是:
always
块一旦结束,assign
语句的效果就会被删除。您必须添加deassign
语句以保留代码中的值(我认为这不是真正的意图)或只是删除 assign
语句。如下图所示:
shiftedValue = in1;
shiftedValue = shiftedValue * 2;
out1 = shiftedValue;