带cocotb的verilog:赋值语句
verilog with cocotb : assign statement
我的 verilog 代码是一个仅使用 assign sum = a+b
的加法器。问题是,虽然 运行 它使用 cocotb
,但 sum
仍然未知,尽管 a
和 b
具有有效值。当我将 sum
设为 reg 类型时,它起作用了。
`timescale 1 ns / 1 ps
module adder(input [7:0] a,
input [7:0] b,
output reg [7:0] sum,
output [7:0] sum2);
assign sum2=a+b; //Trouble is here
always@(a,b) begin
sum=a+b; //This works
end
`ifdef COCOTB_SIM
initial begin
$dumpfile("adder.vcd");
$dumpvars();
end
`endif
endmodule
我认为这实际上是由 v0.9.7 中存在的 Icarus 错误引起的。
如果您升级到最新的开发版本,您会发现连续分配工作正常。其他模拟器也可以很好地处理连续赋值。
如果您卡在那个版本的 Icarus 上,您可以通过将分配放在一个进程中来解决它,正如您发现的那样。
我的 verilog 代码是一个仅使用 assign sum = a+b
的加法器。问题是,虽然 运行 它使用 cocotb
,但 sum
仍然未知,尽管 a
和 b
具有有效值。当我将 sum
设为 reg 类型时,它起作用了。
`timescale 1 ns / 1 ps
module adder(input [7:0] a,
input [7:0] b,
output reg [7:0] sum,
output [7:0] sum2);
assign sum2=a+b; //Trouble is here
always@(a,b) begin
sum=a+b; //This works
end
`ifdef COCOTB_SIM
initial begin
$dumpfile("adder.vcd");
$dumpvars();
end
`endif
endmodule
我认为这实际上是由 v0.9.7 中存在的 Icarus 错误引起的。
如果您升级到最新的开发版本,您会发现连续分配工作正常。其他模拟器也可以很好地处理连续赋值。
如果您卡在那个版本的 Icarus 上,您可以通过将分配放在一个进程中来解决它,正如您发现的那样。