1

問題

私は次の行で仕事に問題がありました:

{ 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 を正しく出力します。

4

2 に答える 2

2

はい、Verilog 左辺値で連結を使用できます。良いコーディングスタイルのようです。他の2つのシミュレーター(vcsとincisive)で動作します。モデルシムにアクセスできません。Modelsim 10.2c のバグだと思います。

于 2013-12-20T21:19:25.363 に答える
1

私はこれをサポート リクエスト 2599370923 としてメンターに報告し、バージョン 10.3 ベータ 2 (間もなくリリース予定) でバグを修正しました。

于 2013-12-23T14:05:36.353 に答える