我可以在Verilog左值中使用concatentation吗? (可能的Modelsim编译器错误?)

时间:2013-12-20 20:59:48

标签: verilog modelsim

问题

我在使用该系列时遇到了麻烦:

{ s_b, s_a[0] } <= 2'd3;

在Modelsim 10.2c中,它似乎分配给b,但不分配给。

有谁知道为什么这不起作用 - 以及它是否在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。

2 个答案:

答案 0 :(得分:2)

是的,您可以在Verilog左值中使用连接。它看起来很好的编码风格。它适用于其他2个模拟器(vcs和精辟);我没有访问modelsim。我认为这是Modelsim 10.2c中的一个错误。

答案 1 :(得分:0)

我已将此报告给Mentor作为支持请求2599370923,他们已修复了版本10.3 beta 2中的错误(即将发布)。