問題
私は次の行で仕事に問題がありました:
{ s_b, s_a[0] } <= 2'd3;
Modelsim 10.2c では、b に割り当てられているように見えますが、a には割り当てられていません。
これが機能しない理由を知っている人はいますか? Verilog のスタイルが悪いのでしょうか?
完全なテスト コード
`timescale 1ns/1ps
module modelsim_top_tb;
`define CLK_PERIOD 20
reg clkin = 1'b0;
reg aresetn = 1'b0;
always begin : clkgen
#(`CLK_PERIOD/2) clkin <= ~clkin;
end
always @(posedge clkin) begin: rstgen
#(`CLK_PERIOD*10) aresetn <= 1'b1;
end
initial begin
#(`CLK_PERIOD*20)
$stop();
end
test1 u_test1
(
.clk(clkin),
.aresetn(aresetn)
);
endmodule
module test1(
input wire clk,
input wire aresetn);
reg [7:0] s_a;
reg s_b;
always @(posedge clk or negedge aresetn) begin
if (!aresetn) begin
s_a <= 8'h00;
s_b <= 1'b0;
end else begin
//{s_a[0]} <= 1'd1; // This works
{s_b,s_a[0]} <= 2'd3; // This does not work, a is displayed as 0
$display("a=%d b=%d",s_a,s_b);
end
end
endmodule
再現する手順
私はコマンドでこのコードをテストしています:
vlib work
vmap work
vlog testcase.v
vsim -c -do "run -all; quit -f" modelsim_top_tb
Modelsim 10.2c では、クロック サイクルごとに s_a の値 0 が出力されます。
ただし、EDA プレイグラウンドで同じコードを実行すると、すべてのシミュレータ (Modelsim 10.1d を含む) は、最初のクロック サイクルが経過した後、s_a の値 1 を正しく出力します。